DXライブラリLoadGraphによる強制終了

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

DXライブラリLoadGraphによる強制終了

#1

投稿記事 by nkj » 14年前

初めまして。

DXライブラリの、LoadGraphやLoadDivGraphを呼び出した際に、アプリケーションが終了してしまい、原因及び解決策が分からず困っております。

Visual C++ 2008 Express Editionを用いてゲーム製作をしています。
デバッグモードでは何の異常もなく読み込めているものが、exeファイルから直接開いて、デバッガを使わずに起動すると、件の関数の部分で終了してしまいます。
終了時のメッセージは「問題が発生したため、test.exeを終了します。ご不便をおかけして申し訳ありません。」というものです。

以下、ソースコードです。量が多いので、問題の部分だけ抜き出して記述しますがご容赦ください。

コード:

void map::read(int n){
	int pre_image,image_x,image_y;
	int n1;
	char file_name[101];
	FILE *fp;

	switch(n){
		case 1:			
			n1=3;
			break;
		case 2:
			n1=2;
			break;
		case 3:
			n1=3;
			break;
		case 4:
			n1=3;
			break;
		case 7:
			n1=3;
			break;
		case 8:
			n1=3;
			break;
		case 9:
			n1=3;
			break;
		case 10:
			n1=4;
			break;
	}
	
	sprintf_s(file_name,101,"dat/map/%d.png",n1);
	
	pre_image=LoadGraph(file_name);
	GetGraphSize(pre_image,&image_x,&image_y);
	image_x /= 32;
	image_y /= 32;
	DeleteGraph(pre_image);
}
LoadGraphの部分でアプリケーションが終了する、というのは、PlaySoundFileを順番に挟んでいくことで、終了前に音が鳴るかどうかで確認しました。

LoadGraph関数を呼び出す直前に、InitGraphを用いて読み込みをリセット、というのは試してみました。
その場合も同じくLoadGraphで終了してしまうので、LoadGraphの過度な呼び出しではない、と思います。

デバッグモードでは問題なく動くので、LoadGraphの返り値が-1になっていないことは確認しました。
LoadGraphの引数に、file_nameではなく、"dat/map/3.png"と直接打ち込んでも同じ結果でした。
なので、file_nameやsprintf_sの方に問題があるとも思えません。

それと、このコードはRPGのマップ読み込み関数の一部で、引数nで読み込むマップを決定するのですが、読み込むマップによってこの症状が発生するときとしないときがあります。
マップ番号nが、3のときと7のときにのみ、この症状が起こるようです。

デバッグモードでは問題ないものがリリースするとなぜ終了してしまうのか、ということと、関係する変数が同じなのになぜ終了するときとしないときがあるのか、というのが大きな疑問点です。

どうか、お力添えのほどよろしくお願い致します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXライブラリLoadGraphによる強制終了

#2

投稿記事 by softya(ソフト屋) » 14年前

Releaseビルドして「デバッグ開始」した場合はどうなりますか?
それと、Log.txtは実行した場合に残っているはずでが、どうなっていますか?添付をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nkj

Re: DXライブラリLoadGraphによる強制終了

#3

投稿記事 by nkj » 14年前

迅速な回答、感謝致します。

Releaseでビルドし、「デバッグ開始」を試したところ、問題なく作動しました。

Log.txtは、ファイル添付の仕方が分からないので、内容をそのままコピペさせて頂きます。ご容赦ください。
なお、このLog.txtの内容は、Debugでビルドしたものをデバッガを通さずに開いて、終了の症状が出た直後のものとなります。


0:システムの情報を出力します
8: DXライブラリ Ver3.04b
17: OS WindowsXP ( Build 2600 Service Pack 2 )
134: CPU動作速度:大体0.79GHz
144: MMX命令を使用します
152: SSE命令が使用可能です
162: SSE2命令が使用可能です
173: CPUベンダ:GenuineIntel
224: CPU名: Intel(R) Pentium(R) M processor 1.73GHz
236:COMの初期化... 成功しました
363:メモリ総量:702.17MB 空きメモリ領域:164.21MB
374:タイマーの精度を検査します
386:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
400: パフォーマンスカウンターを使用します タイマー分解能 : 3579.545000 KHz
422: ソフトの二重起動検査... 二重起動はされていませんでした
464:ウインドウクラスを登録します... 登録に成功しました
496:ウインドウモード起動用のウインドウを作成します
526:ウインドウの作成に成功しました
586:IMEを無効にしました
601:ウインドウスタイルをウインドウモード用に変更します... 完了
629:DirectInput関係初期化処理
643: DirectInput7 の取得中... 成功
747: 引き続き初期化処理... 初期化成功
787: ジョイパッドの初期化...
826: 入力装置を見つけました
846: デバイスの登録名:ELECOM JC-PS202U series
860: デバイスの製品登録名:ELECOM JC-PS202U series
898: ジョイパッドの追加は正常に終了しました
912: ジョイパッドの初期化は正常に終了しました
928: マウスデバイスの初期化... 初期化成功
956: キーボードデバイスの初期化... 初期化成功
986:DirectInput 関連の初期化は正常に終了しました
1000:DirectSound の初期化を行います
1015:DirectSound インターフェースの取得を行います.... 成功
1050:引き続きインターフェースの初期化処理... 成功
1177: DirectSound デバイスを列挙します
1193: モジュール名: ドライバ記述:プライマリ サウンド ドライバ
1208: モジュール名: smwdm.sys ドライバ記述:SoundMAX Digital Audio
1224: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
1239: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB

1254: 利用可能サンプリング精度
1276: プライマリ 16bit = OK 8bit = OK
1290: セカンダリ 16bit = OK 8bit = OK

1306: 利用可能チャンネル
1321: プライマリ MONO = OK STEREO = OK
1341: セカンダリ MONO = OK STEREO = OK

1358:DirectSound の初期化は正常に終了しました
1377:DirectDraw オブジェクトの取得を行います.... 成功
1414:引き続き初期化処理... 初期化に成功しました
1563:IDirect3D9Ex オブジェクトを取得します.... IDirect3D9 オブジェクトを取得します.... 成功
1653:IDirect3DDevice9 オブジェクトを取得します.... ハードウエア頂点演算を使用します
1977:成功
1994:Driver:ati2dvag.dll Description:ATI RADEON XPRESS 200M Series
2010:画面のフォーマットは D3DFMT_X8R8G8B8 です
2025:Zバッファのフォーマットは D3DFMT_D16 です
2042:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です
2058:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
2072:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です
2089:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
2106:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です
2121:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
2138:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です
2153:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です
2174:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です
2190:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です
2206:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です
2222:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です
2240:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です
2256:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です
2430:バックバッファロック転送の時間:50618nsec 一時的な描画可能バッファを使用した転送の時間:2424nsec
2447:バックバッファロックを使用しません
2464:Zバッファを作成します.... 成功
2574:プログラマブルシェーダーを使用します

2950:フォントの初期化を行います
2973:フォントの初期化は正常に終了しました
2990:文字コードバッファの初期化を行います... 完了しました

non
記事: 1097
登録日時: 15年前

Re: DXライブラリLoadGraphによる強制終了

#4

投稿記事 by non » 14年前

初期化されていない変数はありませんか?

また、念のため、
switchにはdefaultを作り、n1に何か値を入れましょう。
LoadGraphの返値(pre_image)が-1の処理も加えてみましょう。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DXライブラリLoadGraphによる強制終了

#5

投稿記事 by softya(ソフト屋) » 14年前

特にLog.txtにエラーは出てないですね。
exe直接実行で出るエラーは、もっと詳しい情報は出ていないのでしょうか?

exe直接実行で起こる問題なのでLoadGraphよりもフォルダ構成とかが怪しいですが、デバック技法を駆使して調査してみましょう。
OutputDebugString()と言う関数があります。これは、デバッグ情報を+デバッガに出力するもので様々な調査に使えます。PlaySoundFile()よりも確実な情報が捉えれますよ。
「OutputDebugString 関数」
http://msdn.microsoft.com/ja-jp/library/cc428973.aspx
VC++なら出力ウィンドウに表示されますが、exe直接実行では表示されないのでDbgMOnというツールを使いましょう。
「DbgMOn」
http://www.vector.co.jp/soft/win95/prog/se169346.html
このツールならexe直接実行したプログラムのOutputDebugString()のメッセージをキャッチできます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nkj

Re: DXライブラリLoadGraphによる強制終了

#6

投稿記事 by nkj » 14年前

>nonさん
回答ありがとうございます。

変数の初期化、defaultの追加、LoadGraphの返り値が-1のときの動作の追加を試してみました。
結果はこれまでと同じでした。
LoadGraphの返り値が-1のときの動作も、起こりませんでした。

>softyaさん
exeから開いた場合でも、中身を見る方法はあるのですね。
早速試してみます、ありがとうございました。

解決したり、進展があったらまたご報告差し上げます。

閉鎖

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