関数呼び出し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Cひさしぶり

関数呼び出し

#1

投稿記事 by Cひさしぶり » 11年前

配列の要素を表示したいです。

コード:

#include<stdio.h>
void print(int a[],int j4 ){
int j=0;

for(j=0;j<j4;j++){
 printf("%d",a[j]);
 } 
putchar('\n');

}

void sort(int a2[],int j5){
int j2,j3;
int temp;

for(j2=j5;j2>=0;j2--){ 

  for(j3=0;j3<=j2;j3++){
          
          if(a2[j3]==0){
            temp=a2[j3];
            a2[j3]=a2[j3+1];      
            a2[j3+1]=temp;    
                   }
                 }
}

                         }
void ast(int a3[],int j6){
   int n1;
   printf("添え字入力");
   scanf("%d",&n1);
   a3[n1]=0;
   a3[j6+1]=0;
   /*print(a3,j6);*/
         }
int main (void){
int n1,j2,j3,n3,j4;
int temp,nx,count; 
int a[5]={1,2,3,4,5};
nx=sizeof(a)/sizeof(a[0]); 
for(;;){
 printf("0:終了,1:詰める");
 scanf("%d",&n3);
 if(n3==0)
   break;
 switch(n3){
  case 1:
  /* printf("添え字入力");
   scanf("%d",&n1);
   a[n1]=0;
   a[nx+1]=0;*/
   ast(a,nx);
   print(a,nx);
   break;
        }
}

putchar('\n');
print(a,nx);

sort(a,nx);

print(a,nx);


return(0);}
53行の関数ast(a,nx);実行後54行関数print(a,nx);を呼び出せません。
関数print(a,nx)で、配列 a[5]を表示したいです。お返事お願いします。

box
記事: 2002
登録日時: 14年前

Re: 関数呼び出し

#2

投稿記事 by box » 11年前

Cひさしぶり さんが書きました:配列の要素を表示したいです。
そもそも「何をした結果として」配列の要素を表示するプログラムなんですか?
Cひさしぶり さんが書きました:

コード:

                   }
                 }
}

                         }
このあたりに代表されるような、
グッチャングッチャンな字下げを何とかしたいというお気持ちはありませんか?
Cひさしぶり さんが書きました:

コード:

int a[5]={1,2,3,4,5};
nx=sizeof(a)/sizeof(a[0]); 
nxには、どんな値が入りますか?その結果、
Cひさしぶり さんが書きました:

コード:

   ast(a,nx);
   print(a,nx);
配列の定義範囲外の領域にアクセスしているのではないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 関数呼び出し

#3

投稿記事 by かずま » 11年前

配列の範囲外参照をなくすには、次の3行の変更が必要です。

コード:

16c16
< for(j2=j5;j2>=0;j2--){ 
---
> for(j2=j5-1;j2>=0;j2--){ 
18c18
<   for(j3=0;j3<=j2;j3++){
---
>   for(j3=0;j3<j2;j3++){
34c34
<    a3[j6+1]=0;
---
> //   a3[j6+1]=0;  // 削除
グチャグチャなインデント(字下げ)をきれいにすると、

コード:

#include <stdio.h>

void print(int a[], int j4)
{
    int j = 0;

    for (j = 0; j < j4; j++) {
        printf("%d", a[j]);
    }
    putchar('\n');
}

void sort(int a2[], int j5)
{
    int j2, j3;
    int temp;

    for (j2 = j5 - 1; j2 >= 0; j2--) {
        for (j3 = 0; j3 < j2; j3++) {
            if (a2[j3] == 0) {
                temp = a2[j3];
                a2[j3] = a2[j3 + 1];
                a2[j3 + 1] = temp;
            }
        }
    }
}

void ast(int a3[], int j6)
{
    int n1;
    printf("添え字入力");
    scanf("%d", &n1);
    a3[n1] = 0;
}

int main(void)
{
    int n3;
    int nx;
    int a[5] = { 1, 2, 3, 4, 5 };
    nx = sizeof(a) / sizeof(a[0]);
    for (;;) {
        printf("0:終了,1:詰める");
        scanf("%d", &n3);
        if (n3 == 0)
            break;
        switch (n3) {
        case 1:
            ast(a, nx);
            print(a, nx);
            break;
        }
    }
    putchar('\n');
    print(a, nx);
    sort(a, nx);
    print(a, nx);
    return (0);
}
使用していない変数の宣言をやめました。

Cひさしぶり

Re: 関数呼び出し

#4

投稿記事 by Cひさしぶり » 11年前

インデントは、注意を他のところでもうけました。よければどこか学べるところを教えてください。
修正ありがとうございます。配列の要素を表示できました。

much

Re: 関数呼び出し

#5

投稿記事 by much » 11年前

Cひさしぶり さんが書きました:インデントは、注意を他のところでもうけました。よければどこか学べるところを教えてください。
ググればいっぱいありますよ

①「 { 」が出る → 次の行は一定スペース空ける
②「 } 」が出る → その行から一定スペース戻す

一定スペースはTABでも半角スペース数個でもよい
個人的には半角スペース×4を推奨

(抜粋)

コード:

#include<stdio.h>
void print(int a[],int j4 ){    //←「 { 」がある
    int j=0;                    //←半角スペースを4つ分あける
 
    for(j=0;j<j4;j++){          //←「 { 」がある
        printf("%d",a[j]);      //←半角スペースをさらに4つ分(計8)あける
    }                           //←「 } 」があるので半角スペース4つ分戻す
    putchar('\n');
 
}                               //←「 } 」があるので半角スペース4つ分戻す

Cひさしぶり

#6

投稿記事 by Cひさしぶり » 11年前

インデントも教えていただきありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る