プロが教えるわが家の防犯対策術!

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のほうがぜんぜんがんばり屋です。最近の若いヤツといったらなまけものでしょうがないですね。
どうすれば良いでしょうか。

A 回答 (6件)

必要なループ回数を先に求めてから 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 ) {
(処理)
}
    • good
    • 0

>(処理)



ここでは具体的に何をしているのでしょうか。
    • good
    • 0

≻t=0;


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

Windows アプリケーションなら、長時間メッセージループを処理しないと、アプリケーションが無限ループに入った、もしくは暴走していると判断されかねません。



時間の掛かる処理をしている間も、メッセージループを処理する様に実装しましょう。

コンソールアプリケーションなら、この回答は無視してください。
    • good
    • 0

t,dt,tfinalの型は?doubleやfloatでは無いですか?


・t=t+dt; こんな書き方は誤差がどんどん蓄積されていくので、基本使わない方がよいです。
できるならループ回数から直接計算するようにした方がよいです(t=dt *N とか)

・VC++6と2005以降で、doubleやfloatを使用したときに生成されるコードが変ったそうです。そのため、精度に違いが出るようです。
http://homepage1.nifty.com/herumi/prog/prog90.html
    • good
    • 0

すみませんが補足を要求いたします。


dtの値はどうなってますでしょうか。
VC++6のときの値とVC++2008のときの値をお答え願います。

あと、問題が発生した事例で
 t=t+dt;
の前と後とでtの値はどうなっていますでしょうか。

この回答への補足

停止する時は

dt=0.020000 t=18.000000 tfinal=50.000000

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

補足日時:2011/09/12 18:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!