ページ 1 / 1
-1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 15:30
by ユーカリ
現在ゲーム製作中なのですが、単純なAIの動きを実装した直後、もともと完成していたマップデータ(.txt)の読み込み部分が実行時にエラー(.exeの停止)を起こすようになってしまいました。
AI動作を作った後におかしくなったのですが、コンパイルエラーも出てませんし、何よりAIの動作前云々の前にこの「マップデータ読み込み」を行っているはずなので、どうにもよくわかりません。
またエラー時にファイルハンドルをprintfDxで表示するようにしたら-268435456という大きい負の値が表示されました。
対象の.txtファイルは同層のmediaフォルダ内に入っています。
コード:
int MissionLoad()
{
int f=0;
char buf[256];
for(int i=0;i<256;i++){buf[i]='0';}
switch(UseMisData.map)
{
case 0:{
UseMisData.graph=LoadGraph("media\\map01.bmp");
f=FileRead_open("media\\map01.txt");
if(f<=0){printfDx("ファイル展開エラー:filehandle=%d",f);}
break;
}
}
for(int i=0;i<256;i++)
{
if(FileRead_gets(UseMisData.state[i],256,f)==-1)
{
printfDx("マップ読み込みエラー発生\n");
// for(int j=0;j<256;j++){UseMisData.state[i][j]='0';}
break;
}
}
FileRead_close(f);
return 0;
}
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 15:40
by softya(ソフト屋)
コンパイルエラーはエラーの一旦に過ぎません。大半のエラーは実行時に出るものです。
で本題ですが、UseMisData.stateのUseMisDataがどんな構造体か気になります。定義を見せてくださいね。
あとバグ防止のためインデントは正確に行ったほうが良いと思いますよ
【補足】
いや、単なるオープンエラーもあるかも知れません。
log.txtを見せて頂けますか?
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 16:09
by ISLe
実行時エラーとは無関係だと思いますが。
公式サイトのリファレンスにはFileRead_openはエラーのとき0を返し、0以外はファイルハンドルとあります。
FileRead_open
むしろFileRead_getsがエラーかどうかを-1と等しいかとするよりは0以下とするほうが良い気がします。
読み込んだ文字列の長さが負の数というのはあり得ないですからね。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 16:11
by softya(ソフト屋)
ISLe さんが書きました:公式サイトのリファレンスにはFileRead_openはエラーのとき0を返し、0以外はファイルハンドルであるとありますけど。
FileRead_open
むしろFileRead_getsがエラーかどうかを-1と等しいかとするよりは0以下とするほうが良い気がします。
読み込んだ文字列の長さが負の数というのはあり得ないですからね。
なるほど0以外なんですね。失礼しました。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 23:30
by ユーカリ
お二方とも早急な返信ありがとうございます。
……にも関わらずこちらは私用で掲示板を今まで見れませんでした。申し訳ありません。
エラー判定の部分は訂正しておきました。「ファイルハンドルは負の値を取りそうもないな」と思い込みで少し雑にやってしまいました。
ちなみにバグは健在です。
件の構造体はヘッダファイルで以下のように定義しています。
コード:
struct Missiondata
{
int no;//ミッション番号
char name[30];//名前情報保存
char info[4][60];//インフォメーション
int map;//マップ番号
int enemydat;//敵データの扱い番号
int con_a;//各会話呼び出し
int con_b;
int con_c;
int con_d;
int graph;//マップ画像
char state[256][256];//マップ情報保存
};
extern struct Missiondata UseMisData;
ログファイルですが、前々からVCでデバッグした時にはファイルのパスが通らなかった為に今までスルーしてました……。
デバッグ後、……Projects/Debugの中の実行ファイルは普通にパスが通るのですが。
おそらくデバッグ時には実行ファイルがどこか別の場所で動いてるんだと思いますが、それにしてもどこだかわからず現在原因捜索中です。
しばしお待ちください。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月20日(水) 23:33
by ユーカリ
大事な事を申し遅れました。
開発環境はVC2010Express editionです。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月21日(木) 00:19
by softya(ソフト屋)
VC2010Express editionだと異常終了した時に詳細な情報が表示されるはずですが、それをココに貼り付けてもらえますか?
出力ウィンドウに表示されているのでコピペして下さい。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月21日(木) 01:34
by ユーカリ
つまり、ファイル読み込みとは関係ないところに異常終了の原因があるということでしょうか。
出力ウィンドウには現在以下のように表示されています。
'eh.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\KernelBase.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\user32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\gdi32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\lpk.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\usp10.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\msvcrt.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\shell32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\shlwapi.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\imm32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\msctf.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\ws2_32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\rpcrt4.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\nsi.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\winmm.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\ole32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\advapi32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\sechost.dll' を読み込みました。Cannot find or open the PDB file
0:システムの情報を出力します
4: DXライブラリ Ver3.05
7: 論理プロセッサの数 : 4
11: OS Windows7 ( Build 7601 Service Pack 1 )
124: CPU動作速度:大体2.52GHz
127: MMX命令を使用します
130: SSE命令が使用可能です
132: SSE2命令が使用可能です
135: CPUベンダ:GenuineIntel
145: CPU名:Intel(R) Core(TM) i3 CPU M 380 @ 2.53GHz
'eh.exe': 'C:\Windows\System32\dwmapi.dll' を読み込みました。Cannot find or open the PDB file
160:COMの初期化... 'eh.exe': 'C:\Windows\System32\cryptbase.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\uxtheme.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Program Files\McAfee\SiteAdvisor\sahook.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\oleaut32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Program Files\Common Files\microsoft shared\ink\tiptsf.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\version.dll' を読み込みました。Cannot find or open the PDB file
成功しました
213:メモリ総量:1840.43MB 空きメモリ領域:473.19MB
473.19MB
216:タイマーの精度を検査します
218:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
238: パフォーマンスカウンターを使用します タイマー精度 : 2467.812000 KHz
244: ソフトの二重起動検査... 二重起動はされていませんでした
251:ウインドウクラスを登録します... 登録に成功しました
257:ウインドウモード起動用のウインドウを作成します
262:ウインドウの作成に成功しました
'eh.exe': 'C:\Windows\System32\clbcatq.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IME\IMEJP10\IMJPTIP.DLL' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\oleacc.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IMJP10K.DLL' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IME\shared\IMETIP.DLL' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IME\shared\imecfm.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IME\IMEJP10\IMJPAPI.DLL' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\IME\shared\IMJKAPI.DLL' を読み込みました。Cannot find or open the PDB file
364:IMEを無効にしました
368:ウインドウスタイルをウインドウモード用に変更します... 完了
374:DirectInput関係初期化処理
379: DirectInput7 の取得中... 'eh.exe': 'C:\Windows\System32\dinput.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\hid.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\setupapi.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\cfgmgr32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\devobj.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\wintrust.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\crypt32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\msasn1.dll' を読み込みました。Cannot find or open the PDB file
成功
457: 引き続き初期化処理... 初期化成功
468: ジョイパッドの初期化...
479: ジョイパッドの初期化は正常に終了しました
481: マウスデバイスの初期化... 初期化成功
485: キーボードデバイスの初期化... 初期化成功
492:DirectInput 関連の初期化は正常に終了しました
'eh.exe': 'C:\Windows\System32\msacm32.dll' を読み込みました。Cannot find or open the PDB file
498:DirectSound の初期化を行います
501:DirectSound インターフェースの取得を行います.... 'eh.exe': 'C:\Windows\System32\dsound.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\powrprof.dll' を読み込みました。Cannot find or open the PDB file
成功
515:引き続きインターフェースの初期化処理... 'eh.exe': 'C:\Windows\System32\MMDevAPI.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\propsys.dll' を読み込みました。Cannot find or open the PDB file
スレッド 'Win32 スレッド' (0x2220) はコード 0 (0x0) で終了しました。
'eh.exe': 'C:\Windows\System32\AudioSes.dll' を読み込みました。Cannot find or open the PDB file
成功
'eh.exe': 'C:\Windows\System32\avrt.dll' を読み込みました。Cannot find or open the PDB file
613: DirectSound デバイスを列挙します
618: モジュール名: ドライバ記述:プライマリ サウンド ドライバー
621: モジュール名:{0.0.0.00000000}.{1cf912ad-5028-42f7-8b54-dc55176b7e82} ドライバ記述:スピーカー (Realtek High Definition Audio)
624: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
626: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
629: 利用可能サンプリング精度
632: プライマリ 16bit = OK 8bit = OK
635: セカンダリ 16bit = OK 8bit = OK
637: 利用可能チャンネル
640: プライマリ MONO = OK STEREO = OK
642: セカンダリ MONO = OK STEREO = OK
645:DirectSound の初期化は正常に終了しました
'eh.exe': 'C:\Windows\System32\d3d9.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\d3d8thk.dll' を読み込みました。Cannot find or open the PDB file
657:DirectDraw オブジェクトの取得を行います.... 'eh.exe': 'C:\Windows\System32\ddraw.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\dciman32.dll' を読み込みました。Cannot find or open the PDB file
成功
688:引き続き初期化処理... 'eh.exe': 'C:\Windows\System32\igdumdx32.dll' を読み込みました。Cannot find or open the PDB file
'eh.exe': 'C:\Windows\System32\igdumd32.dll' を読み込みました。Cannot find or open the PDB file
初期化に成功しました
730:IDirect3D9Ex オブジェクトを取得します.... 成功
738:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します
1042:成功
1045:Driver:igdumdx32.dll Description:Intel(R) HD Graphics
1048:画面のフォーマットは D3DFMT_X8R8G8B8 です
1050:Zバッファのフォーマットは D3DFMT_D16 です
1053:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です
1055:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
1057:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です
1060:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1062:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です
1064:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1066:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です
1068:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です
1071:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です
1074:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です
1076:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です
1079:描画用 16bit カラーフォーマットは D_D3DFMT_R5G6B5 です
1081:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
1083:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
1086:最大テクスチャサイズ 幅:4096 高さ:4096
1088:テクスチャステージテンポラリレジスタ:使用可
1090:減算合成のハードウェア対応:ネイティブ
1093:頂点シェーダーバージョンコード:300
1095:ピクセルシェーダーバージョンコード:300
1130:バックバッファロック転送の時間:6763nsec 一時的な描画可能バッファを使用した転送の時間:997nsec
1133:バックバッファロックを使用しません
1135:Zバッファを作成します.... 成功
1154:プログラマブルシェーダーを使用します
1248:フォントの初期化を行います
1253:フォントの初期化は正常に終了しました
1256:文字コードバッファの初期化を行います... 完了しました
eh.exe の 0x002fed87 で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
eh.exe の 0x002fed87 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月21日(木) 10:46
by softya(ソフト屋)
エラーを見る限りNULLポインタの参照ですね。
これが何処の命令で発生しているかですがデバッガの機能で確認して下さい。
※ エラーが出た時にウィンドウが出て「中断」を選べば停止した命令が表示されます。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月22日(金) 10:18
by ユーカリ
色々試したところ、おっしゃるとおりポインタのエラーのようでした。
箇所も発見し訂正したところ、ファイルハンドルの問題は解決し、ロードは無事に成功するようになりました。
原因のエラー箇所はファイルロードのところとは関係のない最近追加したAIの進行ルート考慮用の関数内でしたが……。
なんとなくそうだろうかとは思ってましたが、この関数同士にはあまり関係性がなかったのでどうしてこのような遠いところでエラーとして出てきたのかは結局不明のままです。
AI行動用のプログラムはバグの該当箇所だけでなく、ついでに丸々構造体の配列を使用した物からポインタを使ったリストを使用する物にほぼ全文書き換えてしまったので、具体的にどのように報告したらいいかよくわかりませんが、該当関数内でのエラーの原因は条件分岐の要素が欠けていたせいで使用できないポインタを参照していたことです。
おかげさまで無事解決いたしました。ありがとうございました。
まぁ直ったら直ったで今度はAIの挙動が思ったとおりに行かないのでまたお世話になるかもしれませんが……デバッグにも少し慣れたのでしばらく独力で頑張ってみようと思います。
Re: -1以外の負の値を示すファイルハンドル
Posted: 2012年6月22日(金) 11:19
by softya(ソフト屋)
配列範囲外やポインタの操作ミスで予想もしない変数を書き換えることはよくあります。
これは別のソースファイルにある変数に影響を与えたり、全く関係ないローカル変数を書き換えたり色々な悪さをしますので覚えておいて下さい。
そういう事なるべく起こさない書き方と言うものもあります。
※ 使ってはいけないポインタを使ったら必ず落ちるようにしておくとかassertで範囲外チェックするなど。