• ベストアンサー

不具合が発生(API・C言語)

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

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

ヒマなんで見てみました(笑) まず ・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から始まるプログラムは 通常コンソールを持っていないので、ここで 出そうとしているエラーメッセージはどこにも出力されません。 他にも指摘したいところはありますがとりあえずこれだけにしておきます。

noname#142813
質問者

補足

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

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

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

noname#142813
質問者

補足

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

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

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

noname#142813
質問者

補足

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

  • crew21
  • ベストアンサー率26% (58/222)
回答No.1

こういう質問の仕方はNGだよ。 どういうことで困っているかはわかるけど、リンク先に何百行ものプログラムを書いて「教えて」てのはNGです。 いったいどんなヒマ人ですか。 こんな事に答えてくれる人って。 せめてそこから抜粋して、たぶんこの辺が問題じゃないかと思うのだがどうでしょうか、的な訊き方をしないと。

noname#142813
質問者

補足

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

関連するQ&A