関数が二度実行されてしまう状況を解決する方法?

解決


myth  2004-05-16 00:51:22  No: 53673

上手く説明しづらいのですが
例えば、

////////////////

int i;

WinMain()
{
 Plus();
}

Plus()
{
 i++;
}

////////////////

というようなプログラムで(かなり端折ってありますが)
Plus()が一度しか呼び出されていないはずなのに、二度実行されてしまいiが+2されてしまうというのが今の状態です。
この現象についての解決方法、というか、何故こうなってしまうのかが検討もつきません。
原因や、解決方法について、何か思い当たることがあれば教えていただきたいです。


myth  2004-05-16 00:53:54  No: 53674

っと、追記です。
↑のプログラムだと、WinMainがループして何度もPlus()を呼び出してるようになってしまってますが
実際のプログラムでは、マウス操作やキー入力を受けてから、Plus()を呼び出すようにしているので
その点でループして呼び出してしまっているわけではありません。

さらに、何度も、ではなく確実に毎回二回ずつ実行されてしまうという状態です。

あと、開発環境はVC++を使っています。


isshi  2004-05-16 02:18:30  No: 53675

その現象が再現できるコードを提示したほうがよいと思います。


RiSK  2004-05-16 10:29:10  No: 53676

マクロで副作用が複数回起こることもあります。


myth  2004-05-16 22:26:24  No: 53677

失礼しました、これが実際のソースです。

/////////////////////////////
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さん
お答えありがとうございます。
ですが、今回提示したとおり、この部分でマクロは使っていません。
マクロは他の部分で数の置換で使っている程度です。


YuO  2004-05-16 23:45:37  No: 53678

TextAreaSetの中でtext_lxがインクリメントされていたりしませんか?


myth  2004-05-17 09:14:43  No: 53679

>YuOさん

いえ、それは確かめてみましたが、ありませんでした。
TextAreaSet内でインクリメントされていたら
text_lxが、そこでまず+1され、その後の
text_lx ++
で、もう一度インクリメントされて、合計+2になるので
text_lxが、この関数が呼び出された時点で2だった場合、if文の時に4になってしまうため
0にリセットされずに、延々と増えてしまうはずなんですが
その現象も確認されていないので、見落としの可能性も低いです。

純粋に二度実行されてしまっているみたいなんですが。
その原因らしきものが、さっぱり分かりません。


RAPT  2004-05-17 09:41:15  No: 53680

その関数の呼び出しはどう記載していますか?


YuO  2004-05-17 16:20:46  No: 53681

「text_lxの変更」にブレークポイントをおいて書き換える場所を調べてみる,というのも手です。

それから,TextLineが二度実行されていることを確認してください。


Toshi  2004-05-17 18:12:24  No: 53682

それって本当に2度実行されてるんですかねぇ?
最初に提示されたソースも2度目に提示されたソースも
変数の初期化をしてないのが気になりますが・・・
(って言うか、2度目のソースは宣言されてる変数名と
  使用している変数名が微妙に違うし・・・
  失礼ながら私と同じくおっちょこちょいっぽい感じが
  するので、ちょっとしたケアレスミスがどこかに有る
  んじゃないかと思いますが)


たく  2004-05-17 20:14:50  No: 53683

ステップ実行で確認するが吉。

WM_LBUTTONDOWNとWM_LBUTTONUPで2回とか^^


myth  2004-05-18 10:58:39  No: 53684

皆さん、回答ありがとございました。
ボタンダウンとアップの両方で呼び出して、二回になってしまっていたのが原因でした。
何とか解決できました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加