dポイントプレゼントキャンペーン実施中!

WINDOWS APIをc言語でプログラムしているものです。
こちらのプログラムを書いたのですが、
http://onegaisimasune.web.fc2.com/main8.txt
左クリックで線を引くのですが、
線を引いていると普通の文字は消えないのですが、
ある操作をした整数を表示させるようにすると、
その整数が変わってしまいます。
どうしたら直るのでしょうか。
宜しくお願い致します。

A 回答 (4件)

ヒマなんで見てみました(笑)



まず
・Visual C++ でコンパイルしたら警告が出て
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

bugs.c
e:\work\t\1102\bugs.c(770) : warning C4715: 'kouzoutai' : 値を返さないコントロー
ル パスがあります
e:\work\t\1102\bugs.c(1669) : warning C4700: 値が割り当てられていないローカルな
変数 'hPen' に対して参照が行われました。
e:\work\t\1102\bugs.c(1677) : warning C4700: 値が割り当てられていないローカルな
変数 'hDC' に対して参照が行われました。

実行すると、(たぶんSEGVで)こけました。

ですのでざっと眺めてみましたが、気になる点がぞろぞろ。

>grep -i hdc bugs.c
HDC hdc,hDC;
hdc = BeginPaint(hWnd , &ps);
TextOut(hdc , 100 , 100 , str , lstrlen(str));
TextOut(hdc , 600 , 100 , str , lstrlen(str));
TextOut(hdc, 10, 10, "風が吹けば桶屋が儲かる", 22);
SelectObject(hdc , hpen);
Rectangle(hdc , 10 , 280 , 900 , 600);
SelectObject( hDC, hPen ); // 作成したペンを使用するよう
に設定
MoveToEx(hdc , start[i].x , start[i].y , NULL);
LineTo(hdc , end[i].x , end[i].y);// 四角形を描画
MoveToEx(hdc , start[num].x , start[num].y , NULL);
LineTo(hdc , end[num].x , end[num].y);// 四角形を描画

>grep -i hpen bugs.c
HPEN hPen;
HPEN hpen;
hpen = CreatePen(PS_SOLID , 0 , 0XFF << 16);
SelectObject(hdc , hpen);
DeleteObject( hPen );
hPen = CreatePen( PS_SOLID, 1, RGB(0, 0, 0) ); // 黒い点
線のペンを作成
SelectObject( hDC, hPen ); // 作成したペンを使用するよう
に設定
DeleteObject( hPen );


確かにCは変数名の大小文字を区別しますが、これはひどすぎ。

変数の名前付けで言えば
> int count, i,read,j,k,l=0,flag,flag1=0,flag2 = 0;

xxx1, xxx2, ... というのも勘弁ですが、
「何のためのフラグであるか」を明示するような名前にすべきであって、
「フラグである」ことだけがわかる名前は意味がありません。

> /* 予約語が見つかったら、カウンタに1加える */
> int BSearch(char *word)

> /* ki[i].number2を何らかのバブルソートでソーティング */

これらは練習のためにライブラリ関数を使わなかったのですか?

最後に

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {

で、
if ((fp = fopen(szFileName, "r")) == NULL) { /* ファイルを開けなかったら */
fprintf(stderr, "Can't Open C Source File!\n") ;/* メッセージを表示して */
exit(2); /* シェルへ戻る */
}


ということをやってますけど、WinMainから始まるプログラムは
通常コンソールを持っていないので、ここで
出そうとしているエラーメッセージはどこにも出力されません。

他にも指摘したいところはありますがとりあえずこれだけにしておきます。

この回答への補足

ご指摘ありがとうございます。
小文字にしても不具合は直らないですよね。
どこが問題なのでしょうか。。。
もう一度直してみたいと思います。

補足日時:2007/11/02 12:52
    • good
    • 0

#2のzwiです。


追記させてもらうと。
現状のプログラムは、例えるなら不十分な知識で設計された木造一階建てに2階、3階と建て増ししているような物で、崩壊しても当たり前です。
今までの経験を生かして、基礎のしっかりしたまず鉄筋コンクリート建てのプログラムを1階から作ってみましょう。
不十分な理解の部分は、この際色々実験して理解を深めてから使うようにしましょう。

この回答への補足

ありがとうございます。
一から勉強してみます。

補足日時:2007/11/02 13:37
    • good
    • 0

さすがに大きくなりすぎて、私も片手間ではバグチェック出来ないです。


解決するためには、問題の機能だけを切り出したプログラムを作って動作確認してみるのが1つの方法です。
そろそろデバックするテクニックを身に付ける時期に来てると思いますので、色々とまず自分で工夫してみてください。

この回答への補足

ありがとうございます。
デバッグの仕方を少し考えてみます。

補足日時:2007/11/02 12:29
    • good
    • 0

こういう質問の仕方はNGだよ。



どういうことで困っているかはわかるけど、リンク先に何百行ものプログラムを書いて「教えて」てのはNGです。

いったいどんなヒマ人ですか。
こんな事に答えてくれる人って。

せめてそこから抜粋して、たぶんこの辺が問題じゃないかと思うのだがどうでしょうか、的な訊き方をしないと。

この回答への補足

ありがとうございます。
そうですね、もう一回見直してみる事にします。

補足日時:2007/11/02 12:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!