• ベストアンサー

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

以下のプログラムがコンパイルできません。 #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

  • 最頻度のプログラム

    以下のような最頻度のプログラムを作成しました.最頻度が1つしか存在しないような場合はうまく動くと思います.しかし最頻度の数字が2つ以上存在すると,一番はじめに書い最頻度の数字しか表示しないと思います.どう改良すれば,すべての最頻度の数字を拾ってくれますかね. /*最頻値を求めるプログラム*/ #include<stdio.h> int main(void) { int i,j; int count=0,COUNT=0; double num[20]; double max; printf("最頻値を求めます.数字を20個入力してください.\n"); for(i=0;i<20;i++) { printf("%d\t",i+1); scanf("%lf",&num[i]); } for(i=0;i<20;i++) { count=0; for(j=i+1;j<20;j++) { if(num[i]==num[j]) { count++; } if(COUNT<count-1) { COUNT=count; max=num[i]; } } } printf("%lfが最頻値です.\n",max); return 0; }

  • あるプログラムの結果がうまく表示されません

    以下のプログラムを書いたのですが、結果が正確に表示されません。 どこが間違っているのでしょうか? プログラムの内容は10個の整数を入力し、更に入力した数字で割れる個数を表示するものです。 #include <stdio.h> void input_i(int *in, int num); int div_enable(int *in, int num, int divisor); int main(void) { int array[10]; int i, s_num; input_i(array, 10); scanf("%d", &s_num); i = div_enable(array, 10, s_num); printf("%d\n", i); return 0; } void input_i(int *in, int num) { int i; for(i=0; i<num; i++){ scanf("%d", in+1); } } int div_enable(int *in, int num, int divisor) { int cnt, i; cnt = 0; for(i=0; i<num; i++) { if(in[i]%divisor == 0){ cnt++; } } return cnt; }

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • 線形探索と二分探索

    線形探索と二分探索のプログラムを作成中です。 自力(本やwebに落ちているサンプルを参考にして)でここまで作りましたが正直自信がありません。どうかお願いします。 #include <stdio.h> #define ARRAYI1_MAX sizeof(array1) #define ARRAYI2_MAX sizeof(array2) //int binary_search(int*,int,int); //二分探索関数のプロトタイプ宣言 int liner_search(int*,int,int); //線形探索関数のプロトタイプ宣言 void main(void) { int array1[]={2,3,5,8,12,20,32,52}; int array2[]={22,34,65,66,12,33,43,5,1}; int result,key; printf("探す文字を入力して下さい。\n"); sacnf("%d",&key); result=liner_search(array1,ARRAYI1_MAX,key); if(result<0){ printf("見つかりませんでした\n");} else{ printf("%d番目に見つかりました\n",result);} } //線形探索 int liner_search(int*array,int num_array,int key) { int i=0; for(i=0;i<result;i++) } /*二分探索 int binary_search(int*array,int num_array,int key) { }*/

  • 分散を求めるプログラム

    n人の点数を読み込みそれらの平均、分散を計算するプログラムを作りたいのですが分散の式がよく分かりません。 分散を求める式は第i番目の点数をxi、平均をμとすると 分散=1/nΣxi^2-μ^2 で、プラグラムを作ってみると #include<stdio.h> int main (void) { int i; int sum=0; int num,tmp; printf("何人ですか"); scanf("%d",&num); for(i=0; i<num; i++) { print("No. %d ", i+1) scanf("%d",&tmp); sum += tmp; } printf("平均:%.3f\n",(double)sum/num); printf("分散:%.3f\n",(double){(sum-sum/num)*(sum+sum/num)}/num); return(0); } というプログラムを作ってみたのですが分散の計算がうまくいきません。どなたか分散の計算のプログラムを教えて下さい。 C言語初めてまもないので不備があったらすみません。

  • 動的配列の受け渡しについて

    動的に定義した2次元配列を受け渡す方法がわからなくて困ってます。 配列に-1以外が入っている場合の行数を数えるプログラムを作成しています。 しかし、コンパイルすると下のエラーが出てコンパイルできません。 error:cannot convert 'long int **' to 'long int (*)[2] for argument '1' to 'long int count_line(long int (*)[2])' #include <stdio.h> long count_line(long arrau[][2]); int main(void){   long** test = new long* [100];   for(long num1=0 ; num1<100 ; num1++){     test[num1] = new long [2];   }   for(int i=0 ; i<100 ; i++){     test[i][0]=-1;     test[i][1]=-1;   }   for(int num2=0 ; num2<10 ; num2++){     test[num2][0]=1;     test[num2][1]=1;   }   int x=0;   x = count_line(test);   printf("x=%d\n",x); } long count_line(long array[][2]){   long count=0;   long end=0;   long roop=0;   while(end!=-1){     if(array[roop][1]!=-1){       count++;     }     end=array[roop][1];     roop++;   }   return(count); } どなたかお助けをー(T_T)

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします