• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:無限ループと誤認される?[VC++2008])

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

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

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

  • ベストアンサー
  • 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% (2127/6289)
回答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