• ベストアンサー

配列がお手上げです。

プログラム初心者です。 いつもはUNIXでC言語をしているのですが、 WINDOWSでもプログミングをしたかったのでVC++5.0を最近使い始めました。 Cでは問題なくc++,a.outができたのですが、VCになると、ビルドがエラー0で通るのですが、 実行してみると強制終了になってしまって、困っています。 下に簡略化したプログラムを貼っておきました。 基本的なことですが、何故実行した時に強制終了してしまうのか教えてください。 お願いします。m(__)m ****************************************************************** #include<math.h> #include<stdio.h> #define No 65536 void main(){ double vof[No],v1[No],t; int n; vof[1]=0; v1[2]=0; for(n=0;n< 55000;n=n+1){ t=0.0001*n; vof[n+2]= 5*sin(2*3.141592*t); v1[n+2] = 2e+5*(vof[n+2]-0.5*vof[n+1]); } } ***************************************************************

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.10

こんにちは。itohhといいます。 他のかたの補足なので控えていたのですが、回答が付かないようなので。 >どうしたら、スタックサイズを増やせるか、もう少し詳しく教えていただけないでしょうか? 1.該当のプロジェクトを開いてください。 2.メニューの「プロジェクト(P)」「設定(S)」で「プロジェクトの設定」ダイアログを表示   してください。 3.「リンク」タブの「カテゴリ(Y)」を「アウトプット」にしてください。 4.「スタックアロケーション」「予約(V)」を「0x200000」にしてください。 5.「OK」ボタンを押下してください。 これで、スタックサイズが増加したと思います。 今一度、ビルド後、実行結果を確認してみてください。

delta-s
質問者

お礼

回答ありがとうございます。 早速やってみて、うまく動きました。 本当にありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (9)

  • bir
  • ベストアンサー率44% (11/25)
回答No.9

先の方もおっしゃっている通り、スタックサイズのデフォルト値は1MBなのでスタックオーバーフローを起こしているのでは。 ちなみにヒープ領域のデフォルトも1MBなので、newやmallocで確保するのもまずいと思われます。 解決方法としては、 ・コンパイラオプション(/F)あるいはリンカオプション(/STACK)で充分なスタックサイズを指定する ・vof, v1を外部変数にしてデータセグメント内に置いてしまう といったところでしょうか。

すると、全ての回答が全文表示されます。
回答No.8

VCのスタックサイズはデフォルトだと1MBです。 2MBぐらいに増やしてやれば問題無く通ります。

delta-s
質問者

補足

回答ありがとうございます。 さっそくVCでやってみたのですが、VC初心者なのでやり方がわかりません。 どうしたら、スタックサイズを増やせるか、もう少し詳しく教えていただけないでしょうか?

すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.7

No1のコードでも強制終了となると, 65536という値が悪いのでしょう. 65535にしてもエラーがでますか? これでエラーにならないなら,65536 が 2^16 であることに問題がありそうです. エラーになるなら,メモリ確保の問題かもしれません. ところで,終了時のエラーメッセージはどうなっていますか? MS-DOSウィンドウからコマンドを実行すると,エラーメッセージも表示されると思いますよ.

delta-s
質問者

お礼

度々ありがとうございます。 65535でやってみました。 それでも実行できません。 MS-MOSになった瞬間、 「このプログラムは不正な処理を行なったので強制終了されます。」って出てきました。

すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.6

No5.嘘でした. Overflowが表示され,一瞬でウィンドウが消えていたので勘違いしました. Floating exception: Overflow メモリ アロケーション エラーです. となりました.これでしょうか.

すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.5

試してみたら,n が 40になる前に vof[n+2]かv1[n+2]の値あたりが,doubleで扱える範囲を超えてしまいました.(LSICの場合) 理由はこれでは?

すると、全ての回答が全文表示されます。
  • sssohei
  • ベストアンサー率33% (33/98)
回答No.4

> 実行してみると強制終了 配列の範囲外アクセスなどをしている可能性が高いです。 この場合、UNIX上ではたまたま動作していたにすぎないです。 0で除算だとUNIXでも落ちるはず??ですし このプログラムを読んでみたのですが怪しいところは見あたらないので、fprintf(STDERR,"エラーメッセージ");などを仕込んでみるか、デバッガを使ってみてどこで落ちているのか把握してみてください。

すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.3

この簡略化したプログラムでも同様のエラーはでますか?

すると、全ての回答が全文表示されます。
  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 >下に簡略化したプログラムを貼っておきました。 省略した場所にバグが有るのではないでしょうか? まずは、VC++5.0のデバッガーでどこで異常終了するのか、確認をしてみてください。 異常終了するのであれば、「デバッグしますか?」とメッセージボックスがでると思いますから そこからデバッガーに入って確認できると思いますよ。 デバッガーの使い方を解説しているサイトがありますからそちらを参考にしてください。 「VC++の使い方」 http://www.nitoyon.com/vc/

参考URL:
http://www.nitoyon.com/vc/
すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

はずしてるかもしれませんが, #include<math.h> #include<stdio.h> #define No 65536 void main(){ double vof[No],v1[No],t; int n; printf("OK.\n"); } で動きますか? つまり,配列の大きさが大きすぎるのかな,と思いました. こういうのは処理系に依存しそう.

delta-s
質問者

お礼

色々と回答ありがとうございます。 WOLVさんのプログラムを動かしてみたのですが、これも強制終了になってしまいました。

すると、全ての回答が全文表示されます。

関連するQ&A