上手く説明しづらいのですが
例えば、
////////////////
int i;
WinMain()
{
Plus();
}
Plus()
{
i++;
}
////////////////
というようなプログラムで(かなり端折ってありますが)
Plus()が一度しか呼び出されていないはずなのに、二度実行されてしまいiが+2されてしまうというのが今の状態です。
この現象についての解決方法、というか、何故こうなってしまうのかが検討もつきません。
原因や、解決方法について、何か思い当たることがあれば教えていただきたいです。
っと、追記です。
↑のプログラムだと、WinMainがループして何度もPlus()を呼び出してるようになってしまってますが
実際のプログラムでは、マウス操作やキー入力を受けてから、Plus()を呼び出すようにしているので
その点でループして呼び出してしまっているわけではありません。
さらに、何度も、ではなく確実に毎回二回ずつ実行されてしまうという状態です。
あと、開発環境はVC++を使っています。
その現象が再現できるコードを提示したほうがよいと思います。
マクロで副作用が複数回起こることもあります。
失礼しました、これが実際のソースです。
/////////////////////////////
void TextLine( void )
{
long text_x;
TextAreaSet( 50, 45,382+(text_lx*20), 255,255,255, "ラインX" );
text_lx ++;
if( text_lx == 3)
text_lx = 0;
}
////////////////////
長かったのでかなりの部分を割愛してますが、主だった部分は以上です。
TextAreaSetは、指定座標(この場合45,382+(text_lx*20))にテキストを表示するものです。
この状態で、text_lxが0,1,2,0,1,2...となるべきなのが
実際に呼び出して見ると、0,2,1,0,2,1,0...となってしまいます。
やりたい事は、呼び出されるたびにtext_lxを+1ずつずらし、テキストの表示座標を動かして
スクロールしているように見せることなのですが。
>RiSKさん
お答えありがとうございます。
ですが、今回提示したとおり、この部分でマクロは使っていません。
マクロは他の部分で数の置換で使っている程度です。
TextAreaSetの中でtext_lxがインクリメントされていたりしませんか?
>YuOさん
いえ、それは確かめてみましたが、ありませんでした。
TextAreaSet内でインクリメントされていたら
text_lxが、そこでまず+1され、その後の
text_lx ++
で、もう一度インクリメントされて、合計+2になるので
text_lxが、この関数が呼び出された時点で2だった場合、if文の時に4になってしまうため
0にリセットされずに、延々と増えてしまうはずなんですが
その現象も確認されていないので、見落としの可能性も低いです。
純粋に二度実行されてしまっているみたいなんですが。
その原因らしきものが、さっぱり分かりません。
その関数の呼び出しはどう記載していますか?
「text_lxの変更」にブレークポイントをおいて書き換える場所を調べてみる,というのも手です。
それから,TextLineが二度実行されていることを確認してください。
それって本当に2度実行されてるんですかねぇ?
最初に提示されたソースも2度目に提示されたソースも
変数の初期化をしてないのが気になりますが・・・
(って言うか、2度目のソースは宣言されてる変数名と
使用している変数名が微妙に違うし・・・
失礼ながら私と同じくおっちょこちょいっぽい感じが
するので、ちょっとしたケアレスミスがどこかに有る
んじゃないかと思いますが)
ステップ実行で確認するが吉。
WM_LBUTTONDOWNとWM_LBUTTONUPで2回とか^^
皆さん、回答ありがとございました。
ボタンダウンとアップの両方で呼び出して、二回になってしまっていたのが原因でした。
何とか解決できました。
ツイート | ![]() |