スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

かつて戦ったバグ4

色々と失敗した経験を書くコーナー(?)です。
今日で第4回目となりました。
毎回3つずつ出していきます。ではどうぞ↓

【バグNO.10】 ヘッダファイルじゃない
w-------ww-------ww-------w概略コードw-------ww-------ww-------w

BOOL CheakHp(void)

  if(player.hp > 0)
    return(TURE);
  else
    return(FALSE);

【実行結果】
c:\documents //中略// 定義されていない識別子です。

w-------ww-------ww-------w概略コードw-------ww-------ww-------w

これは、主人公のHPがあればTRUEHPが0以下(戦闘不能)ならばFALSE
返す関数です。
BOOL型なので、ヘッダファイルをインクルードし忘れたのかな?
と思い、ヘッダファイルをチェックしてみたのですが、
ちゃんと#include<windows.h>となっていました。
「何でかなー?」とエラーを良く見てみると、 「TURE」。
【正】TRUE
【誤】TURE

ただのスペルミスでした。
個人的に、TRUEとTUREは見落としやすいです。
何故かスペルが合っているように見えてしまう のですよ。


【バグNO.11】CPUが死ぬかもしれない
w-------ww-------ww-------w概略コードw-------ww-------ww-------w

void GameMain(void)

 //背景を表示する処理
 //アイテムを表示する処理
 //敵を表示する処理
 //主人公を表示する処理


w-------ww-------ww-------w概略コードw-------ww-------ww-------w

見ての通り、ゲームメイン関数です。
ですが、大切なものが抜けてます。
Sleep関数が無い。
(Sleep関数 = 指定した時間、CPUを休ませる処理。)

これを実行したらどうなるかと言うと、
CPU使用率が100%になります。
自分のPCは、実行した瞬間「ウィィイイン!!」とか鳴り出して焦りました。
(ファンの音)

急いでプログラムを停止させようと、ウィンドウの"×"を連打したのですが、
そもそも制御が返ってこないので消えてくれない。
最終的にどうなったかというと、
---------------------------------------------------------
ご不便をかけて申し訳ございません 問題が発生した為//中略
【エラーを報告する】 【キャンセル】

---------------------------------------------------------
みたいなウィンドウが表示され、プログラムは停止しました。
とりあえず、無限ループでのバグは怖いです。


【バグNO.12】 縦横がおかしい
w-------ww-------ww-------w概略コードw-------ww-------ww-------w

field[0][1] = ITEM_BLOCK;
field[0][2] = ITEM_BLOCK;
field[0][3] = ITEM_BLOCK;

for(int i = 0; i < 5; i++)
  for(int j = 0; j < 5; j++)
    BitBlt(hdc, i * 30, j * 30, //省略);

【実行結果】
縦横

w-------ww-------ww-------w概略コードw-------ww-------ww-------w
二次元配列のマップに、ブロックデータを3つ入れて表示させたものです。
本来なら、横に3つ並ぶはずなのですが、縦に3つならんでます。

自分は、しばらく内部のデータがおかしいのかなと調べていたのですが、
原因は描画する方でした。

2重のfor文は見ての通り、上の方からy座標x座標となります。
しかし、BitBlt関数が受け取る値は左からx座標y座標です。
逆になるのです。


よく2重ループではiとjを用いるのですが、(歴史的な理由がある
それだとミスが分かりづらいので、変数をx、yにすれば間違いに気付きやすくなります。
【誤】
for(int y = 0; y< 5; y++)
  for(int x = 0; x < 5; x++)
    BitBlt(hdc, y * 30, x * 30, //省略);
【正】
for(int y = 0; y< 5; y++)
  for(int x = 0; x < 5; x++)
    BitBlt(hdc, x * 30, y * 30, //省略);

(30をかけてるのは、画像の大きさが30×30だからです)

データやプログラムは正しいのに、
描画する時点で間違ってしまったという例でした。
(”内部の処理に問題がある”と思い込むと、発見が遅れる)
スポンサーサイト

テーマ : 日記 - ジャンル : 日記

コメント

No title

最後のはFieldの添え字のX, Yを逆にすれば解決するのでは?(^_^;)

ポインタの考え方からすると、Field[Y][X]が正しいとは思いますが、私は直感的にわかりやすいのでField[X][Y]としています。

どういう訳か、大抵の描画処理用の関数の引数って、X、Yの順番になってますよね。

No title

なるほどーv-293
添え字の方を変えて解決することが出来ますねv-290
自分はずっと[y][x]でやっていました。

描画の関数は、大抵はx、yの順番なので、
プログラム中のxとyを入れ替えてみることにします(・u・)+
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。