• ベストアンサー

プログラムのバグについて

以下のプログラムがコンパイルできません。 #include<stdio.h> int sigma(int);このプロトタイプ宣言がしたの関数定義と矛盾を起こしている ということはどうゆうことか教えてください。 int main() { int array[11]; int num; int count; for(count = 0; count < 11; count++ ){ printf("array[%d]",count); scanf("%d",&array[count]); if(array[count] = 0)break; num = sigma(array[count]); printf("sigma >> %d\n",num); } exit(0); } /*関数名:sigma 引数 :array[11] 返り値:入力された整数の総和*/ int sigma(int array[11]) { int arg[11]; int count; for(count = 0;count < 11;count++){ arg[count] = 0; arg[count]+= array[count]; } return(arg[count]); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

正解プログラムを載せておきます。 まだ、プログラム初心者のようですね。 プログラムにかなりのバグがあり、少し理解に苦しみました(苦)。 注意点だけ書いておきますので、お手元の参考書を見ながら、 私の作成しましたプログラムと比較してください。 ・関数の宣言の方法が違います。 ・配列を関数へ渡す方法が違います。 ・変数を宣言した後、初期化をせずに変数を使用しています。 ・if文の等式判定が間違えています。'='が1つだと、そのまま代入になります。 TABがうまくここに書き込めないため、プログラムが読みづらいのはご容赦ください。 #include<stdio.h> int sigma(int *array);//関数の宣言 ポインタ渡しであることを宣言 // ダミーの引数名として array を使用 int main() { int array[11]; int num = 0; // 初期値 0 int count; for (count = 0 ; count < 11 ; count ++) array[count] = 0; for (count = 0 ; count < 11 ; count++) // 11回ループ { printf("array[%d]",count); // 数値入力待ち scanf("%d",&array[count]); if(array[count] == 0) // 数値が 0 ? break;//終了 num = sigma(array);//ポインタ渡し printf("sigma >> %d\n",num); // } exit(0); } /*関数名:sigma 引数 :array[11] 返り値:入力された整数の総和 */ int sigma(int *array) { int count; int arg = 0; for(count = 0 ; count < 11 ; count++) arg += array[count]; return arg; }

ku_by_wada
質問者

補足

|以下のようになりました。 array[0]1 sigma >> 136004551 array[1]2 sigma >> 136004553 array[2]3 sigma >> 136004557 array[3]4 sigma >> 136004561 array[4]5 sigma >> 136004567 array[5]6 sigma >> 136004573 array[6]7 sigma >> 1486272 array[7]8 sigma >> -1072332200 array[8]9 sigma >> -2146113871 array[9]10 sigma >> 1074148491 array[10]11 sigma >> 66 Segmentation fault

その他の回答 (5)

  • kaz-sugi
  • ベストアンサー率50% (3/6)
回答No.6

回答じゃないですが、、、 TanakaShinyaさんは、当然確認されて投稿してらっしゃるのですよね? プログラムが妙な動きをしているのは、 失礼ながらもしかするとku_by_wadaさんのタイプミスではないでしょうか? (1) 妙な値を表示する理由 main()関数の頭のほうにある for 文の文末に ';'をつけてませんか? for (count = 0 ; count < 11 ; count ++)  ←ここ array[count] = 0; 11番目の値を入力したときに正しい値が表示されているようですので、 そのように推理しました。 (2) Segmentation faultの理由 main()関数の、2つめのforループの条件式が、 <= になったり、 < 12 になったりしてませんか? 11番目までは動作しているので、そのように推理しました。 #トンチンカンでしたら、失礼しました。

ku_by_wada
質問者

補足

以下が書き直したプログラムです。バグはなおっていません。 #include<stdio.h> int sigma(int *array,int num) { int arg,i =0; for(i = 0;i < num;i++) arg+= *(array+i); return(arg); } int main() { int array[11]; int num ; int i; for(i = 0; i < 11; i++ ){ printf("array[%d]",i); scanf("%d",&array[i]); if(array[i] == 0)break; num = sigma(array,i); printf("sigma >> %d\n",num); } exit(0); }

回答No.5

責任をとってフォローします。 私は VC でコンパイルし正常動作確認をとりましたが、 どうも結果からみて sigma() の array の値がうまく渡されていないのか…。 もしかすると、コンパイラによっては sigma() 内の SUM 部分を for(count = 0 ; count < 11 ; count++) arg += *(array + count); としないといけないのかも。 こればっかりは自信なし。 selenity さんのプログラムでも同様の結果でしたら、 arg += *(array + i); と変えてみてください。 #ご使用のコンパイラの種類を教えていただけますか?

ku_by_wada
質問者

お礼

ぼくが書いたソースファイルは書き換えてしまって残ってないのですが、 どうやらぼくのタイプミスによるものだったようです。 最初にtanakaさんが示してくれたものでも、良く動きました。 最後まで懇切丁寧な指導ありがとうございました。

ku_by_wada
質問者

補足

悲しいことに、未だに同様の結果です。 使用しているのは、Linuxのlib/ccomです。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.4

私なら、以下のように書きますね。 ます、関数のプロトタイプ宣言による記述ミスを避ける ため、関数定義を関数呼出し前に記述します。 また、「char *」以外の配列は受け取った先の関数内 でのチェック方法が無いため、現在使用中の要素数を 添えて呼び出すことをお薦めします。 これで無駄が省けます。 #include<stdio.h> int sigma(int *array, int num) {  int i, arg=0;  for(i=0;i<num;i++){   arg += array[i];  }  return(arg); } int main() {  int array[11];  int num;  int i;  for(i=0;i<11;i++){   printf("array[%d] : ",i);   scanf("%d",&array[i]);   if(array[i] == 0) break;   num = sigma(array,i);   printf("sigma >> %d\n",num);  }  exit(0); }

  • arthur
  • ベストアンサー率34% (15/43)
回答No.2

すみません、ちょっと日本語がおかしかったので訂正します^^; 誤:引数はint型の引数を渡すように宣言しているのに対して 正:引数はint型の変数を渡すように宣言しているのに対して

  • arthur
  • ベストアンサー率34% (15/43)
回答No.1

プロトタイプ宣言では int sigma(int); と、引数はint型の引数を渡すように宣言しているのに対して、 実際関数を定義しているところでは int sigma(int array[11]) と引数がint型の配列になっているため、そのことが矛盾しているとエラーは言っているのです。 普通、配列を関数に渡す場合にはポインタを使います。 関数の宣言文を int sigma(int *); に変更し、 関数をコールする部分を num = sigma(array); に変更し、 関数の定義を int sigma(int *array) に変更すればOKです。 もし、ポインタについてわからなければまた補足ください。

ku_by_wada
質問者

補足

今気付いたんですが、sigma関数の中で、まだ値を全部渡されてないのにarray を計算してますよね。僕が作りたいのは、渡された値に対して逐次和を計算していく 関数なんです。

関連するQ&A