• ベストアンサー

C言語でプログラムを書いています

C言語でプログラムを書いています コンパイルに成功し、実行すると 「****.exeは動作を停止しました」 というエラーが出て、実行が強制終了されてしまいます このエラーはどのような場合に出るものであって、その解決法などご存知の方がいたら 教えていただきたいと思います 解説が載っているHPのURLでも構いませんので、よろしくお願いします

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

問題は大ありです。 というか「途中まで行って失敗する」場合、その「途中まで」の部分にも誤りがあるから「以降でコケる」ということを憶えましょう。 > learn = (double **)malloc(sizeof(double *)*4); > for(m = 0; m < 4; m++) > learn[m] = (double *)malloc(sizeof(double)*324); これで確保したメモリは、静的に書くと double learn[4][324]; と同じことです。 従って、 > for(a=0;a<324;a++){ > b=learn[a][0]; これの5週目、即ちa=4の時には既に範囲外の b=learn[4][0]; // learn[4]の分は確保されていない! という事になります。 前段のm, qの二重ループでは合っているのに……

chirily
質問者

お礼

問題は解決しました 回答を拝見して恥ずかしくなってしまいました 基本的なことを見落としていたようです・・・ 的確な指摘、ありがとうございました

その他の回答 (3)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.3

まず、どんな操作をしたら、その現象がでるのかをつきとめる その操作内の全ての関数の先頭に printf( "関数名" ); をつけておく、で、停止した関数をつきとめる 停止した関数の要所要所に printf( "その1:a=%d",a ); 等、あやしそうな部分の内容を表示できるようにして 実行する その5で、停止したなら、 printf( "その5" );から printf( "その6" );の間で怪しい箇所がないか調査する 流れ的にはこんな感じでしょうか IDEによってはステップ実行のような便利な機能が付いてる物 もあるかもしれませんが、無いという前提で書いてます。

chirily
質問者

お礼

どこが問題となっているか発見することができました ありがとうございます

chirily
質問者

補足

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp,*fp2,*fp3; double **dataF,**datanF,**learn; int i,k,j,p,m,q; int a,b; double c,e,f; dataF = (double **)malloc(sizeof(double *)*236); for(i = 0; i < 236; i++ ) dataF[i] = (double *)malloc(sizeof(double)*324); datanF = (double **)malloc(sizeof(double *)*11786); for( j = 0; j < 11786; j++ ) datanF[j] = (double *)malloc(sizeof(double)*324); fp = fopen( "mitface_ftest_mix.data" , "r" ); fp2 = fopen( "mitface_nftest_mix.data" , "r" ); //データを行列形式に格納 dataF=[i][k] for( i = 0; i < 236; i++ ){ for( k = 0; k < 324; k++ ){ fscanf(fp,"%lf",&dataF[i][k]); } } //データを行列形式に格納 datanF=[j][p] for( j = 0; j < 11786; j++ ){ for( p = 0; p < 324; p++ ){ fscanf( fp2 , "%lf" , &datanF[j][p] ); } } //学習データのポインタの作成 learn = (double **)malloc(sizeof(double *)*4); for(m = 0; m < 4; m++) learn[m] = (double *)malloc(sizeof(double)*324); fp3 = fopen( "memory.data" ,"r" ); printf("OK"); //学習データを行列形式に格納 learn=[m][q] for( m = 0; m < 4; m++ ){ for( q = 0; q < 324; q++ ){ fscanf( fp3 , "%lf" , &learn[m][q] ); } } b=0; c=0.0; e=0.0; f=0.0; for(a=0;a<324;a++){ b=learn[a][0]; if(learn[a][2]==0.0){ c = dataF[a][b+1] - learn[1][a]; } if(learn[a][2]==1.0){ c = learn[1][a] - dataF[a][b+1]; } e = c * learn[a][3]; f = f + e; printf("%lf",f); } printf("%lf",f); return 0; } 問題点としては最後のforループ内にあるようです for内でprintfした結果、4週目までは計算しており5週目の途中で停止してしまうと思われます 4週目までは計算しているということは文法に問題はないと思うのですが…

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

もっとも多いのはメモリ保護例外。 要するに「そのプログラムがアクセスすることを許されていないメモリにアクセスしようとした」ということ。 他にも要因はあるけどコードを見ないとなんとも言えない、というのは#1の通り。

chirily
質問者

お礼

ありがとございます

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

さすがにこれだけじゃぁ無理ですよ。 考えられるのは、メモリリークが発生しているとか、Main関数に不正な処理が書かれて居るんじゃないかなぁ程度です。 最低でも、 開発環境と開発言語(コンパイラの種類)とどんなコードを書いているのか位は書いてください。 それから、コンパイル・リンクの 設定で ターゲットOSやCPUの設定はあっていますか? 最低限のコードでやってみてみてください。 それでも上手くいかなければ、設定の間違いがあるかも知れません。

chirily
質問者

お礼

一般的にどのような場合で起こるのかなと思って安易に質問してしまいました 次からはコードを真っ先に提示していきます ありがとうございました

関連するQ&A

  • C言語のプログラムが実行できません。

    C言語のプログラムが実行できません。 コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。 これは何のエラーなんでしょうか? 基本的な事かもしれませんが、分かる方宜しくお願い致します。

  • Cプログラムが終了しない

    MacのOSXでMPWを使ってCのプログラミングを始めました。プログラムの最後にreturn 0;を入れているのに実行すると終了しないまま止まってしまいます(エラーは起っていないようです)。今は強制終了させていますが、なぜプログラムが終了しないのでしょうか。またMPWについて詳細に解説されているサイトなどありましたら教えて頂けませんか。

  • C言語について

    最近C言語でプログラミングを試みようとしてるのですが、コンパイルの時点でよく分かりません。 どのようなソフトでどのようにインストール・設定し、どのようにコンパイルするかなど、C言語でのプログラムのコンパイルから実行までを詳しく教えてください。

  • Vista c言語でのエラー

    c言語のプログラムで、整数を入力して結果を表示するプログラムなのですが、 コンパイルして、a.exeを実行して、整数を入力したら、 Microsoft Windowsから 「a.exeは動作を停止しました」 「問題が発生したため、プログラムが正しく動作しなくなりました。」 と出ました。 それまでは順調に動いていたのに、それ以降類似のプログラムでも同じようになりました。 しばらくは「問題のレポートと解決策」にて 「Trojan.PWS.Legmir.AD / W32.Ahlem.A@mmウイルスをコンピュータから除去する」という Windowsの警告メッセージが表示されましたが、繰り返しているうちに出なくなりました。 「a」という名前が悪いと聞いて、名前を長短いろいろ変えてもだめでした。 ほかの「a.exe」も消してみましたがだめでした。 Windows Vista MinGW環境でコマンド プロンプトを使用してます。 ウイルスバスター2011も使ってます。

  • Javaのプログラムから、C言語のプログラムを呼び出す方法

    こんばんわ。 もうすぐ2008年もおしまいですね。 本日お聞きしたいのは、タイトルの通り、 Javaで書いたプログラムで、C言語のプログラムを呼び出し、 実行するプログラムはどのように書いたらよいかということです。 実際に行いたい内容は以下の通りです。 ・JavaからC言語で書かれたNN.exeを呼び出し、実行する。 です。 どのようなプログラムで呼び出すことができるのでしょうか。 あまりプログラムの知識がなく、説明に不備がありましたらすいません。 お力添え、宜しくお願いいたします。

  • C言語による実行

    C言語で記述したソースプログラムを入手しました。これをコンパイルして実行する具体的な方法を教えて下さい。私は、MS-Fortran,FBASICのソースプログラムからコンパイルし、実行することをしております。

  • C言語 メモリ?

    最近、C言語の勉強を始めているものです。 gccでコンパイルし、実行ファイルを実行すると 強制終了 と表示されます。 gdbで実行してみると、 Program terminated with signal SIGKILL, Killed. The program no longer exists. You can't do that without a process to debug. と表示されました。 プログラムの中で、二次元配列 a[10000][10000],b[10000][10000] というような大きい配列を使っているのが原因なのかなと思っていますが、どうなんでしょうか?mallocでメモリを確保したらいいのでしょうか? ソースを載せることができなく申し訳ないですが、よろしくお願いします。

  • C言語の勉強にあたって

    今からC言語を勉強していく人から質問されたのですが、勉強にあたって、Cのアプリケーション(コンパイラ等)なしに実際のプログラムの動きを勉強する方法はないでしょうか? これでは漠然とした書き方ですが、例えば、インターネットのHP上でプログラミング→コンパイル→実行をシミュレーションできるようなHPはないでしょうか? こういうHPがあると、とりあえずインターネット環境とC言語の参考書があれば簡単に勉強できると思うんです。 そのようなHP、ありましたら教えてください。 何ヶ所かあるようでしたら、使い方が難しくない(初心者向け)ところが良いです。 よろしくお願いします。

  • C言語を始めよう!

    C言語を始めよう! http://www.forest.impress.co.jp/article/2002/10/24/cwohajimeyou.html を使用しています。 NT4/2000/XP で、16 ビットプログラムの実行結果が表示されない  と言う問題は、LSI C-86 Ver.3.30c 試食版をツールを利用して実行するプログラム共通の問題のようです。  CPad for LSI C-86でも、以下のとおり、同様の問題があり、 COMMAND  プログラムで、この問題を解決しようとしています。 phb1122  でも、以前は、 COMMAND を利用した形跡があります。今は、 PIF ファイルを作成 することで解決しています。  なぜ、このような経緯になったのか詳しく解説していただけませんでしょうか? ******************************* WindowsNT/2000上の CPad for LSI C-86 で、コンパイルはできるが、実行結果が表示されない これは LSI C-86 が16ビットアプリケーションであるために起こる現象です。 解決策は、作成した実行ファイルを実行する前に一度、Windows9xとの互換性のために用意されているcommand.comを実行することで回避できます。 CPad での設定方法は、 [設定]ダイアログ-[高度な設定]ページの[以下の設定を変更する(C)]にチェックをしてから、[実行するコマンド(B)]に %WINDIR%\system32\command.com /c exit > nul と記述して[OK]ボタンをクリックします。 これでNT/2000上でも LSI C-86で作成した実行ファイルの出力を確認できます。 また、この現象が起こらない場合もあるようですが、どういう環境で起こって、どういう環境で起こらないのかははっきりわかっていません。 *********************** C:\phb1122\phoebe.htm ★ NT4/2000/XP で、16 ビットプログラムの実行結果が表示されない場合について Windows NT4/2000/XP で、LSI C-86 試食版を使って 16 ビットプログラムを作成して実行した際に、出力結果が表示されず、空欄になってしまう場合があります。この現象についていろいろ調査してみましたが、NTVDM.EXE の動作に原因がありそうというだけで、それ以上がどうしても分かりません。しかし、強制的に MS-DOS プロンプトを起動させられればうまくいくのではと考え、PIF ファイルを作成し、それを介して実行することで、とりあえず出力結果を表示させることに成功しました。メニューの「ビルド(B)」→「PIF を作成して実行(I)」をチェックすることで設定できます。このメニューは、LSI C-86 試食版をコンパイラに設定しているときのみ有効です。 敬具

  • C言語の参考書について

    大学の後期の授業でC言語の参考書を買ってくるように言われました。 でもどの参考書がいいのかわからないので教えてください!! 前期の授業では ・C言語で作成したプログラムのコンパイルと実行の 流れ ・コンパイルエラーのエラーメッセージの見方 ・実行時のエラーとプログラムの修正 ・C言語のプログラムの基本形 ・printf()と定数 ・変数 ・数値型 ・文字型 ・文字列 ・printf()の書式指定 ・プログラム記述時の約束、予約語 ・算術演算子 ・代入演算子 ・インクリメント、デクリメント演算子 ・比較演算子(関係演算子) ・式が持っている値 ・論理演算子 ・条件付き代入 を勉強しました。 その範囲は、まだちゃんとに覚えてないけど授業でもらったプリントを見れば一応できます。 それで先生いわく、参考書は入門編でもいいらしいんですけど、さらに実践編も買い足さなければいけないらしいんです。 今の状態で実践編でも大丈夫ですかねぇ??

専門家に質問してみよう