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

A 回答 (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番目までは動作しているので、そのように推理しました。

#トンチンカンでしたら、失礼しました。

この回答への補足

以下が書き直したプログラムです。バグはなおっていません。
#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);
}

補足日時:2001/02/09 15:23
    • good
    • 0

責任をとってフォローします。


私は VC でコンパイルし正常動作確認をとりましたが、
どうも結果からみて sigma() の array の値がうまく渡されていないのか…。

もしかすると、コンパイラによっては sigma() 内の SUM 部分を

for(count = 0 ; count < 11 ; count++)
arg += *(array + count);

としないといけないのかも。
こればっかりは自信なし。

selenity さんのプログラムでも同様の結果でしたら、
arg += *(array + i);
と変えてみてください。

#ご使用のコンパイラの種類を教えていただけますか?

この回答への補足

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

補足日時:2001/02/09 15:27
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/02/09 16:22

私なら、以下のように書きますね。


ます、関数のプロトタイプ宣言による記述ミスを避ける
ため、関数定義を関数呼出し前に記述します。
また、「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);
}
    • good
    • 0

正解プログラムを載せておきます。


まだ、プログラム初心者のようですね。
プログラムにかなりのバグがあり、少し理解に苦しみました(苦)。
注意点だけ書いておきますので、お手元の参考書を見ながら、
私の作成しましたプログラムと比較してください。

・関数の宣言の方法が違います。
・配列を関数へ渡す方法が違います。
・変数を宣言した後、初期化をせずに変数を使用しています。
・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;
intarg = 0;

for(count = 0 ; count < 11 ; count++)
arg += array[count];

return arg;
}

この回答への補足

|以下のようになりました。
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

補足日時:2001/02/08 16:01
    • good
    • 0

すみません、ちょっと日本語がおかしかったので訂正します^^;



誤:引数はint型の引数を渡すように宣言しているのに対して

正:引数はint型の変数を渡すように宣言しているのに対して
    • good
    • 0

プロトタイプ宣言では


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

もし、ポインタについてわからなければまた補足ください。

この回答への補足

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

補足日時:2001/02/08 15:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報