• 締切済み

fscanfについて質問です。

さっそく質問させていただきます。 fscanfで、どうしても納得いかないことがあります。 どのように説明して良いのか分からないのでソースを書きます。 (説明用にアレンジ) ------------------------------------------------------ double a[10000][10]    // この程度のサイズの配列 for(i=0;i<10000;i++){   for(j=0;j<10;j++){     // これでは実行時エラー(i=0,j=0の時)     fscanf(fp,"%lf",&a[i][j]);     // これならOK     double buffer;     fscanf(fp, "%lf", &buffer);     a[i][j] = buffer;   } } ------------------------------------------------------ なぜこのようになるのか理由がわかりません。 もしご存知の方がいらっしゃいましたら、 ぜひ教えていただきたいのですが。 私はWINDOWS2000&VC++6を使っております。 よろしくお願いします。

みんなの回答

  • haporun
  • ベストアンサー率40% (230/562)
回答No.5

>原因を解明したいと思います。 解決する気があるなら良かった。 地獄までお付き合いしましょう。 と言いたいところですが、うちではエラーが出ず再現できませんので、環境などによるものかと・・・。 また、なんか気が付いたらお知らせしたいと思います。 締め切らずに待っていれば、他の方からもなにか良い情報が得られるかもしれませんし。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.4

>さっそくのアドバイスありがとうございます さっそくではないですが(笑。 そうですよねぇ、bufferを使ったときは動いてるんですから、ファイルのせいじゃないですよねぇ。 >動くバージョンから書き換えたときは動くことがありましたので しかし、これだとどうも逃げているようで解せませんなぁ。 なんとか配列の要素のポインタを送ったときなぜエラーが起こるのか解明してみたいものですね。 もちろん、あなたがこれで良いというならそれまでですが。

pinko-iz
質問者

お礼

いえいえ、ほんとうにありがとうございます。 >なぜエラーが起こるのか解明してみたいものですね。 >もちろん、あなたがこれで良いというならそれまでですが。 そうなんです。 buffer使えば動く!って経験的に知っているということは、 実際に動いてなんぼの世界ではもちろん大事なことだと思うのですが、 だからそうしときなさい!では納得いかないんですよね。 それで、ここに質問させて頂いたという次第であります。 それに、本来いらないはずの変数を用意するのは抵抗ありますよね。 なんだかCのもつエレガントさというか魅力を損ねているような気がして。 また少しづつ勉強して、原因を解明したいと思います。 どうもありがとうございました。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.3

#include <stdio.h> void main(){ FILE *fp = stdin; double a[10000][10]; /* この程度のサイズの配列 */ double buffer; int i, j; for(i=0; i<10000; i++){ for(j=0; j<10; j++){ /* これでは実行時エラー(i=0,j=0の時) */ fscanf(fp, "%lf", &a[i][j]); /* これならOK */ //fscanf(fp, "%lf", &buffer); //a[i][j] = buffer; } } } ファイル用意してないんでstdinで試してみましたが、(i,j)=(0,0)のときにエラーなんか起こりませんでしたよ。 ファイルポインタはどうなってますか? 無効なファイルを読んでいませんか? ここには書いてないまわりのソースの問題だと思います。

pinko-iz
質問者

お礼

さっそくのアドバイスありがとうございます。 ファイルポインタの件ですが、大丈夫だと思います。 実際に ------------------------------- /* これならOK */   fscanf(fp, "%lf", &buffer);   a[i][j] = buffer; ------------------------------- なら動いておりますので。 もしよろしければ、リビルドして試してみて頂けませんでしょうか? 私のほうでも、動くバージョンから書き換えたときは動くことがありましたので。

  • shogenji
  • ベストアンサー率31% (31/98)
回答No.2

配列が大きすぎて領域確保がうまく行ってないのではないでしょうか? 少なくともうちの環境では,両方ともsegmentation faultです.

pinko-iz
質問者

お礼

さっそくのアドバイスありがとうございます。 やはりそーでしたか。 私のほうでも、配列サイズを小さくすれば動くようになりました。 shogenji様の環境を存じ上げませんが、 これはコンパイラの仕様なのでしょうか?

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

fscanf(fp,"%lf",&a[i][j]); を fscanf(fp,"%lf",a[i][j]); にしてもだめですか?

pinko-iz
質問者

お礼

さっそくのアドバイスどうもありがとうございます。 ところで、fscanfに値を渡して受け取れるのでしょうか?

関連するQ&A