VC++2008でのプログラム実行で止まる問題について

このQ&Aのポイント
  • VC++6で実行可能だったプログラムが、VC++2008で動かすと途中で止まってしまう問題について調査しました。
  • 調査の結果、ループ回数が多すぎることが原因であることがわかりました。
  • 具体的なプログラム例として、tfinalが50の場合は途中で停止し、15の場合は正常に終了することが確認されました。
回答を見る
  • ベストアンサー

無限ループと誤認される?[VC++2008]

VC++6で実行可能だったプログラムがあるのですが、 VC++2008で動かしたところ止まってしましました。 なんでだろうといろいろ調べた結果、ループさせすぎ、ということがわかりました。 コードは t=0; dt=(1./ramda)/100.; tfinal=50; while(t<tfinal){ (処理) t=t+dt; } なんて感じなんですが、このtfinal=が50なら途中で止まり、15なら正常に終わります。 しかし50はしんどいけど15までならええよ、なんて怠慢な処理をされたくありません。 VC++6のほうがぜんぜんがんばり屋です。最近の若いヤツといったらなまけものでしょうがないですね。 どうすれば良いでしょうか。

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

  • ベストアンサー
  • happycup
  • ベストアンサー率42% (9/21)
回答No.3

必要なループ回数を先に求めてから for 等で処理してみたらどうですか? ループのカウンタは余裕をみて64ビットの符合なし整数を使っています。 unsigned long long loopmax = (unsigned long long)(tfinal / dt); if( dt * (dtの型と同じ型へキャスト)loopmax == tfinal ) { --loopmax; //余りが無いなら一つ減らします。 while の処理が t < tfinal なので! } for( unsigned long long cnt = 0 ; cnt < loopmax ; ++cnt ) { (処理) }

その他の回答 (5)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.6

>(処理) ここでは具体的に何をしているのでしょうか。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.5

≻t=0; ≻dt=(1./ramda)/100.; ≻tfinal=50; ≻while(t<tfinal){ ≻(処理) ≻t=t+dt; ≻} このプログラムに問題はありません。 ≻dt=0.020000 t=18.000000 tfinal=50.000000 このデータで止まった場合はここにあるプログラム以外で止まっています。 他の部分を疑ってください。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.4

Windows アプリケーションなら、長時間メッセージループを処理しないと、アプリケーションが無限ループに入った、もしくは暴走していると判断されかねません。 時間の掛かる処理をしている間も、メッセージループを処理する様に実装しましょう。 コンソールアプリケーションなら、この回答は無視してください。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

t,dt,tfinalの型は?doubleやfloatでは無いですか? ・t=t+dt; こんな書き方は誤差がどんどん蓄積されていくので、基本使わない方がよいです。 できるならループ回数から直接計算するようにした方がよいです(t=dt *N とか) ・VC++6と2005以降で、doubleやfloatを使用したときに生成されるコードが変ったそうです。そのため、精度に違いが出るようです。 http://homepage1.nifty.com/herumi/prog/prog90.html

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

すみませんが補足を要求いたします。 dtの値はどうなってますでしょうか。 VC++6のときの値とVC++2008のときの値をお答え願います。 あと、問題が発生した事例で  t=t+dt; の前と後とでtの値はどうなっていますでしょうか。

hiroko0012
質問者

補足

停止する時は dt=0.020000 t=18.000000 tfinal=50.000000 です。 dtとtfinalは固定値で、途中で変動はしません。 停止する直前はt=17.980000です。

関連するQ&A

  • 無限ループ

    今のプログラムが無限ループになる。しかも乱数を使っているので9割以上は正常で1割未満の確率で無限ループになるようです。 netbeans5.5でアプレットで実行は「ファイルを実行」(shift-F6)でやっています。なんとか無限ループになっている箇所を探す方法を教えてください。

  • 無限ループに陥ります

    プログラム中の以下の部分で無限ループに陥ってしまいます while(*a != EOF){ *a = fgetc(fi); if(*a == 32){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } } fiに読み込んでいるファイルの末尾はこんな感じです。 50 49 0 34 34 34 34 34 34 34 34 34 34 34 34 50 49 0 68 68 68 51 51 50 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 [EOF] どなたか分かる方お願いします。

  • 無限ループをわざと作って時計をつくりたい

    無限ループをわざと作って時計を作ろうと思っています。 while(true){ 処理 } とすると無限ループを作ることができると書いてありましたので private void btnRedActionPerformed(java.awt.event.ActionEvent evt) { while(true) { taOutput.setText(""); Date d = new Date(); taOutput.append(d +":" ); Color c = new Color(102,255,255); taOutput.setBackground(c); Font f = new Font(Font.SERIF, Font.ITALIC, 25); taOutput.setFont(f);  } } として実行してボタンを押すと処理が止まって固まってしまうのです。 出力画面にOutOfMemoryErrorと書いてあるのでそのへんの理由だと思うのですが。 ちなみに for (int i = 0; i<5; i++) { } でテストするとうまく動きます。 これを固まらせずにうまく無限ループを続けさせるにはどうしたらいいのでしょうか。

    • ベストアンサー
    • Java
  • 無限ループで出力ストリームが表示されないのはなぜですか?

    次のソースコードをVC++で実行したところ、入力の表示ができませんでした。 でも、無限ループを削除すると、正常に表示されます。 非常に基本的な質問かもしれませんが、理由がわかりません。 ご存知でしたら教えてください。よろしくお願い致します。 #include <iostream.h> int main() { char ss[80]; cout << "何か入力してください:"; cin >> ss; cout << "入力したのは[" << ss << "]です\n"; for(;;) { } }

  • VC++ メインループでのイベント監視方法

    こんにちは。 VC++2008Expressでプログラムをしようと思っている初心者です。 以下、変な疑問があり、お尋ねしたいと思います。 よろしくお願いします。 Windowsアプリケーション Win32API クラスで別スレッドを作成して、そのスレッドからのイベントを WinMainループで受け取る方法ですが 通常皆様はどういう風にするのでしょうか? クラスは、その他のプログラムでも流用可能で様々なアプリに対応しやすいようにしあげたいのですが。。 別スレッドでイベント発生時にWinMainにどのように教えるのが普通のやり方なんでしょうか? 僕の考えでは、WinMain関数内のループ内で常時イベント発生していないか 以下のように監視させるか eventloop el; while(GetMessage(&msg,NULL,0,0)) {   TranslateMessage(&msg);   DispatchMessage(&msg);      if(el::boolEvent){     イベント処理へ   } } とするのが良いか? これだとクラスの関数、変数の使い方さえ分かるようにしておけば流用は簡単 なのかなと思いますが。。 メインのループ内にこんな監視を入れるようなプログラムをみたことないので ナンセンスなのではと思います。 次に考えられるのは、クラスのイベント発生で作成したSendMessageを送って メッセージ処理でイベント処理をさせるのが良いのかなって思いますが これだと、流用するときに対応したMessage(キュー?ですかね)を作成しないといけなく 私的に分かりにくいなーって思います。。。 変なことで悩んで先に進まないのですが、皆様はどのようにコーディングされるのでしょうか? ちなみにイベントというのは、RS232Cで受信があって、そのデータを加工したあとで メモリに格納して格納しましたよってイベントです。 どうかよろしくお願いします。

  • windowsフォームアプリケーションについて

    windowsフォームアプリケーションについて 現在VC++のwindowsフォームアプリケーションを使ってマウスのみで作業ができる環境を作ろうとしてます。 その際に他のプログラムで作成した実行ファイルを外部アプリケーションとして system("C:\\~~\\--.exe") で表示させることに成功しました。 しかしこの実行ファイル(VC++で作成)はwhileループを用いているため途中で終了させることはできない仕組みになっています。 そこでこのwhileループを用いた実行ファイルをwindowsフォームアプリケーションのボタンクリックしたら終了するようなプログラムを作成したいのですがネットなどで調べてもコマンドが分からずに困っています。 アドバイスいただける方よろしくお願いします。

  • VC6.0++でDXライブラリが上手くいかない!

    Windows10で家に昔買った VC6.0++があったのでインストールして DXライブラリのプログラムコードを入力して 実行してみたのですが、 VC6.0++上のビルドでは画像を表示するプログラムなら画像が表示されるし 音を鳴らすプログラムなら音がなるんですが、 作成したexeファイルを実行した場合、プログラムが実行されません なぜでしょうか? 何が悪いのでしょうか? 教えてくださいよろしくお願いします。

  • DOSコマンドでの単純なループ処理

    DOSコマンドで単純なループ処理を記述する方法を教えて下さい。 UNIXで下記のようにwhileコマンドを使用すると、 /export% While(1) ? ループ処理で実行させたいコマンドを記述 ? echo "" ? sleep 3 3秒おきにコマンドの標準出力が表示されます。 Windowsで同じようなことができたらいいなと 思うのですが、簡単な方法を知っている方がいたら 教えて下さい。

  • 無限ループからの脱出

    import java.io.*; public class Test { public static void main(String[] args) throws IOException { String ss; int idt; while(true) { try { BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); System.out.print("数字を入力してください : "); ss = f.readLine(); if(ss == "end") break; idt = Integer.parseInt(ss); System.out.println("あなたの入力した数字は " + idt + " です。"); System.out.println(); } catch(NumberFormatException e) { System.out.println("error : " + e); System.out.println(); } } } } 上記は、コンソールに入力した数字をそのまま出力し、数字以外を入力すると例外処理するプログラムです。 見ていただくと分かるとおり、途中入力したものが「end」だとbreakして無限ループを脱出するということを予定して作りました。 しかしbreakしてくれません。if文の中に処理が移っていないのです。なぜでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • マルチスレッド内のループについて

    こんにちは。 開発環境は VC++6.0 SDI マルチスレッドがあり、2つの処理を行う関数が書かれています。 このスレッドはダイアログボックスに配置したストップボタンを押すとフラグFALSEになりループを終了させます。 2つの関数は、int型の整数を引数にして、処理を行います。 整数はある値に達すると 0 になり永遠にループを続け、2つの処理を行います。 と言う意味合いでプログラムを書きました。(書いたつもりです) (1)この書き方ですと、for内のループが動いている時に、右上の×ボタンでダイアログを閉じると [Debug Assertion Failed!]と言う警告文が出て強制的に終了してしまいます。 ストップボタンを押してもcount=10になるまではループしています。(当然ですが・・。) そもそもマルチスレッドの中にこのような形でfor文を入れるのは間違っているのでしょうか? どのような書き方にすれば良いのでしょうか? よろしくお願い致します。 bool m_flags;//スレッド内の処理を続けるか示すフラグ UINT CabcDlg::thread(LPVOID pParam)// { CabcDlg *pInst = (CabcDlg *) pParam; while(pInst->m_flags){//ストップボタンが押されると終了する。 for (int count = 0; count<10; count++ ) { pInst->OnSend(count); //処理A pInst->OnReceive(count);//処理B } } return 0; }

専門家に質問してみよう