長方形を10個並べるプログラムなんですが、
うまくいきません。
おそらくRectangle()の部分が間違いだと思いますが、
(width+=20) の設定は文法的に間違っているんでしょうか?
教えてください。
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
int i, width=0;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
for(i=0;i<10;i++)
Rectangle(hdc , width, 0, (width+=20) , 180);
EndPaint(hwnd , &ps);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
おそらく、第2引数と第4引数でwidthという同じ変数を使っているから不味いのではな
いでしょうか?
未定義動作なのかな。
確認用サンプル
#include <iostream>
void test(int n) { std::cout << n << std::endl; }
void test(int n, int m) { std::cout << n << : << m << std::endl; }
int main()
{
int n = 0;
test((n += 10));
n = 0;
test(n, (n += 10)); // VC6 だと 10:10 になる
return 0;
}
for(i=0;i<10;i++)
Rectangle(hdc , width, 0, (width+=20) , 180);
この部分ですが、for文でループをまわしていますが、肝心の変数iがどこにもないような気
がするのですが、いかがでしょう? width+=20は問題ないと思います。
たとえば、
for(i=0;i<10;i++)
Rectangle(hdc , width, 0, (width+=20*i) , 180);
としたら、どうでしょうか?
↑for(i=0;i<10;i++)
Rectangle(hdc , width, 0, (width+=20i)*i , 180);
の間違いでした。
あれ、なんか頭がおかしくなってたみたいです。
的外れなことを申してすいません。(反省)
Rectangle(hdc , width, 0, (width+=20) , 180);
こういうのはよくないよ。
コンパイラが引数を評価する順序は決められていない(確かそんなことだった)。
> うまくいきません。
あなたが、どういう動作を期待していて
実際にどうやったらどうなってしまったのか言ってもらわないと
回答に困ると思うけど。
これで一応四角は出るよ。
for(i=0;i<10;i++)
{
Rectangle(hdc , width, 0, width + 20, 180);
width += 20;
}
皆様回答どうもありがとうございます!
いろいろな回答ありがとうございます!
>コンパイラが引数を評価する順序は決められていない(確かそんなことだった)。
勉強になりました!
どうもありがとございます。
解決!