Dxライブラリ:画像ハンドルが不正値を指す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やっくん

Dxライブラリ:画像ハンドルが不正値を指す

#1

投稿記事 by やっくん » 14年前

http://www.play21.jp/board/formz.cgi?ac ... &rln=63832の続きです。
自分で解決できると思い解決ボタンを押しましたが、わからないので新たにトピを立てて質問させてもらいます(^^;
Dxライブラリ使用のため、以下のように「あるファイル」で画像ハンドルを用意しています。

#define FP_NUM 8 // フィールド画像枚数
namespace
{
/***** 画像 *****/
int fieldPic[FP_NUM]; // フィールド画像
int battleFrame; // コマンド選択フレーム画像
int commandBtn; // コマンドボタン
int bPointerLeft[4]; // バトルポインター(左)
int magicPointer; // 魔法のタメをあらわす(正規)
int magicPointer2; // 魔法のタメをあらわす(影)
int damagePic[10]; // ダメージ
int kaihukuPic[10]; // 回復
int battleTerrop; // バトルテロップ
int battleGage; // バトルゲージ1
int battleGage2; // バトルゲージ2
int ariaGage; // 詠唱ゲージ
}

ロードは一律で以下のような形式です。

// フィールド画像
for(int i = 0; i < FP_NUM; i++){
  sprintf(temp, "dat/picture/battleMap/field%d.jpg", i);
  if( (fieldPic = LoadGraph(temp)) == -1)
    OutputError(true, "%s %s", errorSt, temp);
}

ここでロード失敗時、LoadGraph()が-1を返した場合は
OutputError(true, "%s %s", errorSt, temp);
という関数でエラー箇所を表示し、プログラムを終了するようにしています。

ロード後、ブレークポイントを細かくはさんだ所、値はある瞬間まで正常値(何らかの値を保持)でした。

では、どこでエラーが起こってるのか・・・と調べてみると、上記の制的変数(画像ハンドル)があるファイルの関数を呼び出し、そちらにアドレスが飛んだ後でした。

↓その時の変数の値↓
fieldPic[0] = -1; // error値
fieldPic[1] = 正常値;
fieldPic[2] = -1;
fieldPic[3] = 正常値;
fieldPic[4] = -1;
fieldPic[5] = 正常値;
fieldPic[6] = -1;
fieldPic[7] = 正常値;

他の画像ハンドルも同様に配列に読み込んでる場合は上記のように交互に不正値が出現し、通常のハンドルは不正値の物とそうでないものがあります。

原因が全くわかりません。

このようにしたら治るかもしれないよ、というアドバイスを頂けないでしょうか(^^;

<追記>
もしかしたら、配列を扱う際の不正アクセスが原因かもしれないです・・・。
質問している身で申し訳ないですが、自分で間違えを見つけることができるかもしれません。 画像

Dixq (管理人)

Re:Dxライブラリ:画像ハンドルが不正値を指す

#2

投稿記事 by Dixq (管理人) » 14年前

仰るように「オーバーフローしてないか」「おかしなアドレスをポインタに持たせてないか」チェックしてみてはどうでしょう。
forの上限やwhileの抜ける条件なんか重点的に。

ところで、ブレイクポイントはチェックした所じゃなくてもとまります
「指定した値が書き換わったらとめる」なんてこともできますし、メモリを直接監視することもできます。

VC++の使い方をまず学ぶとデバッグ能力がグッと上がりますよ。

やっくん

Re:Dxライブラリ:画像ハンドルが不正値を指す

#3

投稿記事 by やっくん » 14年前

キューさん、返信ありがとうございますm(__)m

>forの上限やwhileの抜ける条件なんか重点的に。
仰るとおりでした。
とても、バグ位置と懸け離れた場所でforの上限値ミスによるものでした。
Define定義した名前で似ている物があり、誤って使っていたようです。

これ系のバグ、とても困りますね(^^;
どこでバグが起きてるか発見しにくいです・・・。

>「指定した値が書き換わったらとめる」なんてこともできますし、メモリを直接監視することもできます。
ブレイクポイントの機能を見てみたらありました!
これができれば今回のことも容易に探す事ができたかもしれないですね。

アドバイスありがとうございます!

一応、バグも取る事ができたので解決とさせてもらいます。

閉鎖

“C言語何でも質問掲示板” へ戻る