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

解決


myth  2004-05-16 00:51:22  No: 53673  IP: [192.*.*.*]

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

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

int i;

WinMain()
{
 Plus();
}

Plus()
{
 i++;
}

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

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

編集    削除
myth  2004-05-16 00:53:54  No: 53674  IP: [192.*.*.*]

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

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

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

編集    削除
isshi  2004-05-16 02:18:30  No: 53675  IP: [192.*.*.*]

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

編集    削除
RiSK  2004-05-16 10:29:10  No: 53676  IP: [192.*.*.*]

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

編集    削除
myth  2004-05-16 22:26:24  No: 53677  IP: [192.*.*.*]

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

/////////////////////////////
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  IP: [192.*.*.*]

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

編集    削除
myth  2004-05-17 09:14:43  No: 53679  IP: [192.*.*.*]

>YuOさん

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

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

編集    削除
RAPT  2004-05-17 09:41:15  No: 53680  IP: [192.*.*.*]

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

編集    削除
YuO  2004-05-17 16:20:46  No: 53681  IP: [192.*.*.*]

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

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

編集    削除
Toshi  2004-05-17 18:12:24  No: 53682  IP: [192.*.*.*]

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

編集    削除
たく  2004-05-17 20:14:50  No: 53683  IP: [192.*.*.*]

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

WM_LBUTTONDOWNとWM_LBUTTONUPで2回とか^^

編集    削除
myth  2004-05-18 10:58:39  No: 53684  IP: [192.*.*.*]

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

編集    削除