環境
windows2000
vc++6.0
上記環境で下記コードをF5で実行するとまず(1)に止まりますが、
次にF5を押すと(1)に止まらずそのままプログラムが終了してしまいます。
不思議な現象が起こります。なぜでしょうか??
#include<stdio.h>
void main()
{
int k=0;
for(k=0;k<8;) //<--ここにブレークポイント(F9)を貼る。(1)
{
k+=1;
}
}
ところが上記コードのこの部分を
for(k=0;k<8;)-->for(;k<8;)にすると次にF5を押したときも(1)に
ちゃんと止まってくれます。
とりです。たまさんとまったく同じ環境で試してみたところ、確かに現象が
発生することを確認しました。そこで、興味を持って調べてみたのですが、以
下の事が原因で違いが発生しているようです。
■毎回止まる場合(for(;k<8;)の時の混合モードの表示)
6: for(;k<8;) //<--ここにブレークポイント(F9)を貼る。(1)
0040102F cmp dword ptr [ebp-4],8 // ←ここにブレークポイントが設定され
る
00401033 jge main+30h (00401040)
■最初の一回しか止まらない場合(for(k=0;k<8;)の時の混合モードの表示)
6: for(k=0;k<8;) //<--ここにブレークポイント(F9)を貼る。(1)
0040102F mov dword ptr [ebp-4],0 // ←ここにブレークポイントが設定され
る
00401036 cmp dword ptr [ebp-4],8 // ←ここから下でループ
0040103A jge main+37h (00401047)
上記のように「混合モード」で表示してみるとわかるのですが、ブレークポ
イントが実際に張られている位置が変化するのが原因かもしれません。
結論からいうと、ループしているのは「cmp dword ptr [ebp-4],8」の部分
のようです。それに対して、「最初の一回しか止まらない場合」にブレークポ
イントが張られるのは「mov dword ptr [ebp-4],0」なので、ループの度に止
まらないようですね。
for(k=0;k<8;)
この場合は、k=0 にブレークポイントがかかり
for(;k<8;)
この場合は、k<8 にブレークポイントがかかるからだと思います
for(k=0;
k<8;)
こう書いて、2行目にブレークポイントを張れば、毎回止まります
たみあさんですが2行目にはっても、とまりませんでした。
> たみあさんですが2行目にはっても、とまりませんでした。
「あれ?」と思いつつ、とりあえず私の方で実験してみた限りではきちんと
止まるようでしたが…。ソースを変更した後リビルドされてみてもダメでしょ
うか?
k<8;)
の行にブレークポイント張ってますよね?
こちらでは毎回止まりますが。。。
何度やってみても止まりません。
混合モードでみても
0040102F mov dword ptr [ebp-4],0<--ここにブレークポイントがはって
ある
00401036 cmp dword ptr [ebp-4],8
> 何度やってみても止まりません。
おかしいですね。現時点で考えられる対策としては、以下のようなことくらい
です。優先度の高い順に列挙しますので、確認してみて頂けますか?
1、ソースファイルと実行モジュールにずれがないか確認する。
2、ブレークポイントを一旦解除して、もう一度正しい場所に設定する。
3、一旦ワークスペースを閉じて、再び読み込み、上記と同様の手順を試みる。
また、まったくブレークポイントで止まらないなら、誤ってリリースモードで
作成された実行モジュールを使っている可能性も考えられます。確認してみてく
ださい。
Cでコンパイルした場合とC++でコンパイルした場合との違いみたいです。
Cでは止まらずC++だと止まります。
(WinXP SP1, VC++6 SP5)
nさんの言われたとおりでした。
今まで*.cをコンパイルしていましたが、*.cppにしたところ止まりました。