• ベストアンサー

配列がお手上げです。

プログラム初心者です。 いつもは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

  • C言語 配列の確保

    はじめまして。C言語の勉強を最近始めたのですが、 以下のプログラムで教えていただきたい点があります。 #include <stdio.h> #include <math.h> #define x 10000 #define y 200000 #define z 1.0E-12 #define k 1.38 #define kE 1.0E-23 #define h 6.63 #define hE 1.0E-34 #define c 3.00 #define cE 1.0E+08 void main(void){ int i; double A[x+1]; double B[x+1]; for(i=0;i<=x;i++) { A[i]=(i+y)*z; B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000)); printf("%e %e\n",A[i],B[i]); }} このプログラムで、xを100000にするとプログラムが動かなくなってしまいます。OSはWindowsXP、ソフトはVisual C++ 6.0を使っています。 解決方法を教えていただけないでしょうか。

  • 二次元配列について

    下記のプログラムにてNが100の時はコンパイル/実行 ともに出来ます。しかし、Nを1024にするとコンパイル は出来るのですが、実行すると"セグメンテーション 違反です"と言われてしまいます。 Cの文法的には正しいと思うのですが、何がいけない のでしょうか? 動作環境はPen4+Linux 2.4.20です。 よろしくお願いします。 ------ ↓以下プログラム #include <stdio.h> #define N 100 //1024 main(){ int i,j; double aa[N][N]; for(i=0;i<N;i++) for(j=0;j<N;j++) aa[i][j]=0; }

  • プログラミング 配列

    配列の各要素に先頭から順に1,2,3,4,5を代入して表示という指示なのですが #include <stdio.h> #include <stdio.h> int main(void) { int vc[5]; vc[0] = 1; vc[1] = 2; vc[2] = 3; vc[3] = 4; vc[4] = 5; printf("vc[0] = %d\n", vc[0]); printf("vc[1] = %d\n", vc[1]); printf("vc[2] = %d\n", vc[2]); printf("vc[3] = %d\n", vc[3]); printf("vc[4] = %d\n", vc[4]); return (0); }で実行したら vc[0] = 2 vc[1] = 3 vc[2] = 4 vc[3] = 5 vc[4] = 5 っていうに出てしまったのですが、上の文の何が間違っていたんでしょうか? 本来なら vc[0] = 1 vc[1] = 2 vc[2] = 3 vc[3] = 4 vc[4] = 5 と表示されるはずなんですが・・

  • 型変換の問題?

    次のプログラムなんですが #include <stdio.h> #include <math.h> #include <cstdlib> #include <iostream.h> void main(){ double v[10000]; for(int b=0;b<10000;b++){ v[b]=2.5+0.01*(double)(rand()%249+1);} for(b=0;b<10000;b++){ int c=(int)(100.*v[b])-251; if(c==192){printf("%d %f\n",c,v[b]);} }} 私の環境のVC++6.0 on win2kのもとで やってみると、printf("%d %f\n",c,v[b])のところで 192 4.43 となったり 192 4.42 となったりします。 真の値は、192 4.43のつもりでプログラムを組んだのですが、 なぜかc=(int)(100.*v[b])-251;という写像は 単射になっていないようです。 さて、質問ですが、double→int型の型変換に原因があるのでしょうか?

  • exp()が計算されなくて困ってます。

    #include <stdio.h> #include <math.h> #define C_B 13.5e-12 #define C_D 5.5e-12 #define R 100 #define Vb 3e3 /* Breakdown voltage [V]*/ #define Vpp 8e3 #define f 50e3 void main(void){ double C,t=0.0; double dt,tmax,i=0,v=0,bv=0,vc1=0,vc2=0,q1=0,q2=0,w=0,CR; FILE *fp; fp=fopen("test4.txt","w"); C=(C_B*C_D)/(C_B+C_D); tmax=(1/f)*2; dt=tmax/1000; w=2*3.14*f; CR=-1/(R*C_B); while(1){  if(fabs(v-vc2)>=Vb/2){   while(1){    v=(Vpp/2)*sin(w*t);    if(fabs(v-vc2)>=0.1*(Vb/2)){     i=(Vpp/2)*(C_B*w/(pow(R,2)*pow(C_B,2)*pow(w,2)-1))*(R*C_B*w*sin(w*t)-exp(CR*t)+cos(w*t)); この式で使われているexpです。↑ q1=q1+i*dt; q2=q2+i*dt; vc1=i/R; vc2=q2/C_B; } else{break;} fprintf(fp,"%1.10f %1.10f %1.10f %1.10f % 1.10f\n",t,v,i,vc2,q2); t=t+dt; if(t>=tmax)break; } } else{ while(1){ v=(Vpp/2)*sin(w*t); i=C*(v-bv)/dt; q2=q2+i*dt; q1=q1+i*dt; vc1=q1/C_D; vc2=q2/C_B; fprintf(fp,"%1.10f %1.10f %1.10f %1.10f\n",t,v,i,vc2,q2); bv=v; t=t+dt; if(fabs(v-vc2)>=Vb/2)break; if(t>=tmax)break; } } if(t>=tmax)break; } fclose( fp ); } この問題を解決できる人がいたら教えてください。

  • WindowsでコンパイルできるがUNIXではできない

    下記のプログラムは、2^-0.94を計算するものです。 このプログラムはwindows2000のマシンでコンパイルできるのですが、UNIXのマシンだと Unresolved text symbol "pow" というエラーがでてコンパイルできません。 UNIXのマシンは「cc ファイル名」でコンパイルを実行します。 どうすればコンパイルできるようになるのでしょうか。お手数ですが、教えてください。よろしくお願いします。 ※windows2000マシンのコンパイラ:Borland C++ Compiler 5.5 #include <stdio.h> #include <math.h> int main() { int a; double b,c; a=2; b=-0.94; c=pow(a,b); printf("%lf\n",c); return 0; }

  • コンパイル結果が違う

    コンパイル結果が違う C言語を勉強中の初心者です。 以下のプログラムをVC++6.0のCL.exeでコンパイルするとうまくいくのですが、VC++2010のCL.exeでコンパイルして実行すると、t2の値が0になってしまいます。 また、VC++2010でコンパイルした方が実行結果も遅いです。 #include <stdio.h> #include <time.h> int main(void) { int i = 1; time_t t1, t2; time(&t1); while(i <= 30000) printf("%d,", i++); time(&t2); printf("\ntime1=%ld time2=%ld\n", t1, t2); printf("かかった時間は、%d秒です\n", t2-t1); return 0; } vc++2010でコンパイルした方のt2の値が、0で表示されてしまうのはなぜでしょうか? よろしく、お願いします。

  • 複数ファイルに分割した時の構成について

    大学の卒論にむけてプログラムを書いていて、一つのmain.cでは長くなってきたので、関数を func1.h func1.c のような別ファイルに記述することにしました。 その現在の構成を、質問欄の下部に簡単に書いたので、構成が自然かどうか意見をお聞きしたいです。特に、 「include文、define文をヘッダファイルにまとめて、各ファイルからincludeしている構造」がコードの記述方法として、きもちわるくないか、一般的かどうか、教えてください。 このようにした理由は、 ・defineマクロを多くのサブ関数で利用している。 ・define定義の値を細かく変えながら実行し、結果の違いを出力したい。 ・その為、各ファイルの頭にdefine定義を置いた場合、定義の値を  いちいち全てのファイルで変更しなければならなくなり、面倒…。 →defineマクロをdefine.hにまとめた。ついでに、<stdio.h>,<math.h>なども置いてしまえばスッキリするかも~。 という経緯です。 理学の学科でまわりに詳しい人がいなく、 プログラム知識もほぼ独学なので、不安に感じて質問しました。 よろしくおねがいします。 +++++++++++++ 以下が、簡単なファイル構成です +++++++++++++ -----define.h----- #include <stdio.h> #include <math.h> #define A_MAX 3 #define B_MAX 5 -----main.c---- #include "define.h" int main() { func1(); func2(); func3(); } -----func1.h---- #include "define.h" void func1(int hoge); //プロトタイプ宣言 -----func1.c---- #include "func1.h" void func1() { hogehoge; } ------func2以下、func1と同構造

  • VC++6.0での配列の動作不良

    現在、VC++6.0のWin32 Console Applicationプロジェクトでプログラムを書いているのですが、配列の様子がおかしいです。 具体的に言うと、ヘッダで #define N 10 #define NN (2*N*2*N) double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; と配列を宣言しているのですが、A,B,Cそれぞれの配列への値の書き込みは普通に行えるのですが、 Sに値を書き込んでいる最中にプログラムが強制終了していまします。エラーメッセージなどはでません。 デバッグすると、Sに値を書き込むfor文の繰り返しの最後のほうに バンドルされていない例外は***.exeにあります。0xC0000005:Access Violation というメッセージが出てそこでプログラムが終了してしまいます。なぜでしょうか? AとSのfor文はまったく同じで、SかわりにAを使うと、このエラーは生じません。 またヘッダで、 #define N 10 #define NN 400 double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; とNNを数字で表すとこのエラーが生じず、普通に実行されます。なぜこのようなことが起こるのでしょうか? どなたか教えていただければ幸いです。お願いします。

  • 桁あふれ誤差のプログラムで質問です。

    1から15までの階乗を計算するプログラムで、階乗を求める関数を定義してその結果を確認し、その際に階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)したいのですが、分からなくて困っています。 関数を使わないで以下のようにやり、 #include <stdio.h> #include <math.h> int main(void) { int n; int ans=1; for(n=1;n<=15;n++) { ans=ans*n; printf("%d!=%d\n",n,ans); } return 0; } これをやってみてなんとか結果が確認できたのですが、上記のように、階乗を求める関数を定義して、この上記のプログラムを書き換えて、そのときに階乗の計算を開始する数と終了する数を記号定数で定義(#defineを使って)して行いたいのですが、 分からなくて本当に困っています。助けてください。

専門家に質問してみよう