- ベストアンサー
配列の範囲を超えて計算されてしまいます
配列数が128*128の二つのfloat型配列shepp[j],img[j]を用意し 二つの配列の差の2乗の総和を計算させています for(j = 0 ; j < 128*128 ; j++){ answer += ((shepp[j] - img[j]) * (shepp[j] - img[j])); } ところが、なぜか配列の最後を一つ越えたj=128*128のステップまで計算してしまい、計算結果に巨大な負数が出現します。 私の環境だと常に -42201683186052844000000000000000000000.000000 が出現してしまいます。 なぜ0~128*128-1の範囲で止まらないのか頭を悩ませています。 どなたかご教授くだされば幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
記載されたとこ以外で、jがオーバーランしているみたいですね。 下記プログラムの実行結果は、 j=16384: ans = 0 となりますよね。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< #include <stdio.h> #define N_MAX (128*128) int main(void) { float shepp[N_MAX], img[N_MAX]; float answer, t; int j; for (j = 0; j < N_MAX; j++) { shepp[j] = img[j] = 0.0; } answer = 0.0; for (j = 0; j < N_MAX; j++) { answer += (t = shepp[j] - img[j]) * t; } printf("j=%d: ans = %g\n", j, answer); return (0); }
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 のお礼のところのプログラムを見たんだけど.... 環境のせいにするな. sum を初期化していないプログラムが悪い. for の挙動も含めて, 勉強し直した方がいいかもね.
お礼
ご指摘ありがとうございます。 おっしゃるとおり、まだまだ勉強が足りませんでした。 基礎からやり直します。
- akiyousan
- ベストアンサー率29% (13/44)
jがきちんとカウントされているかを 確認されたほうが良いかと思います。 それはもう確認済みというのであれば、 これ以降の文章は無視してください。 for(j = 0 ; j < 128*128 ; j++){ printf("j = %d\n", j); } ↑等...で。(出し方はお任せしますが) >なぜか配列の最後を一つ越えたj=128*128のステップまで計算してしまい・・・ 無限ループしてませんか?? 本当に一つ超えたところで止まりますか? 私が考えてるのと違うのかもしれませんが、 とりあえず、jがきちんとカウントされているか確認してみて下さい。 0から1個1個確かめる必要はありません。 明らかに違う可能性があるので、試してみてください。
お礼
丁寧にご教授いただきありがとうございました。 jの動きはprintfで書き出して追っているのですが なぜか指定した範囲の一つ次の配列におかしな数が入り込んできます。 1番に答えてくださった方へのお礼にも書きましたが 私の環境になにか致命的なエラーがあるようです。 残念ですがひとまずあきらめます。 教えてくださったにもかかわらず申し訳ありません。
お礼
お手本のプログラムまで書いてくださりありがとうございます。 残念ながらどうやら私のプログラミング環境自体に問題があるようです。 もっとシンプルに下記のプログラムを試したところ i=5 sum=-858991960 となりました。 ちょっと打つ手が無く絶望的です。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< #include<stdio.h> int main(void){ int array[5]; int sum; int i; /*配列に値を代入*/ array[0] = 100; array[1] = 200; array[2] = 300; array[3] = 400; array[4] = 500; /*配列の総和を表示*/ for(i=0;i<5;i++) sum += array[i]; printf("i=%d sum=%d\n",i,sum); return(0); }