DxLibでリソースが正しく読み込まれない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

DxLibでリソースが正しく読み込まれない

#1

投稿記事 by Aozora0630 » 10年前

初めまして。Aozora0630と申すものです。
今回は、DxLibで作っているHopeZeroというサバイバルゲームにて以下の問題が起こったので相談させていただくことにしました。

コード:

//アイテム読み込み
		FILE *ItemNameCSV = fopen("data\\items\\ItemName.aot","r");
		FILE *ItemDataCSV = fopen("data\\items\\ItemProperty.aoi","r");
		FILE *ItemImageCSV = fopen("data\\items\\ItemImage.aot","r");
		if(ItemNameCSV==NULL)ErrorReport("ItemDataNotFound");
		int cnt = 0;
		int material_cnt = 0;
		for(cnt=0;;cnt++){
			char *dm = "";
			if(fgets(dm,150,ItemNameCSV)==NULL)break;
		}
		fseek(ItemNameCSV,0,0);
		ItemData = new Item[cnt];
		int *insMaterialData = new int[cnt];
		for(int i=0;i<cnt;i++){
			//アイテム名取得
			char *ItemName = "";fgets(ItemName,50,ItemNameCSV);
			ItemName[strlen(ItemName)-1] = 0;
			for(int i2=0;i2<strlen(ItemName);i2++)ItemName[i2]++;
			ItemData[i].Name.assign(ItemName,strlen(ItemName));
			
			//アイテムプロパティ取得
			int ReadByte[11];
			fread(ReadByte,sizeof(int),11,ItemDataCSV);
			fgetc(ItemDataCSV);
			ItemData[i].Category = ReadByte[0];
			if(ReadByte[0]==Material){
				insMaterialData[material_cnt] = i;
				material_cnt++;
			}
			ItemData[i].EatLevel = ReadByte[1];
			ItemData[i].AttackDamage = ReadByte[2];
			ItemData[i].ThermoStay = ReadByte[3];
			ItemData[i].Weight = ReadByte[4];
			ItemData[i].Material[0] = ReadByte[5];
			ItemData[i].Material[1] = ReadByte[6];
			ItemData[i].Material[2] = ReadByte[7];
			ItemData[i].Rot = ReadByte[8];
			ItemData[i].RotToMaterial = ReadByte[9];
			ItemData[i].LightLevel = ReadByte[10];
			
			//アイテム画像ロード
			char *fn = "";
			fgets(fn,100,ItemImageCSV);
			fn[strlen(fn)-1] = 0;
			for(int l=0;l<strlen(fn);l++)fn[l]++;
			ItemData[i].ImageHandle = LoadGraph(fn);
		}
		fclose(ItemNameCSV);
		fclose(ItemDataCSV);
		fclose(ItemImageCSV);
		MaterialData = new int[material_cnt];
		for(int i=0;i<material_cnt;i++){
			MaterialData[i] = insMaterialData[i];
		}
		MaterialLength = material_cnt;
		delete [] insMaterialData;
		ScreenFlip();
		
	//素材の読み込み
		InitSoundMem();
		//音楽
		BGM[0] = LoadSoundMem("textures\\bgm\\bgm-1.mp3");
		BGM[1] = LoadSoundMem("textures\\bgm\\bgm-2.mp3");
		BGM[2] = LoadSoundMem("textures\\bgm\\bgm-3.mp3");
		BGM[3] = LoadSoundMem("textures\\bgm\\bgm-4.mp3");
		//画像
		img_TitleGraph = LoadGraph("data\\title.png");
		LoadDivGraph("textures\\entity\\m\\main.png",6,3,2,40,56,img_PlayerM);
		LoadDivGraph("textures\\entity\\f\\main.png",6,3,2,40,56,img_PlayerF);
		img_backGraph[0] = LoadGraph("textures\\bg\\bg_0.png");
		img_backGraph[1] = LoadGraph("textures\\bg\\bg_1.png");
		img_backGraph[2] = LoadGraph("textures\\bg\\bg_2.png");
		img_backGraph[3] = LoadGraph("textures\\bg\\bg_3.png");
		img_backGraph[4] = LoadGraph("textures\\bg\\bg_4.png");
		img_backGraph[5] = LoadGraph("textures\\bg\\bg_5.png");
		img_backGraph[6] = LoadGraph("textures\\bg\\bg_6.png");
		img_weather[0] = LoadGraph("textures\\weather\\sunny.png");
		img_weather[1] = LoadGraph("textures\\weather\\cloudy.png");
		img_weather[2] = LoadGraph("textures\\weather\\rainy.png");
		img_UIicon[0] = LoadGraph("textures\\ui\\ico_param.png");
			//エンティティ画像
			img_Tree = LoadGraph("textures\\entity\\tree\\main.png");
			img_SereTree = LoadGraph("textures\\entity\\seretree\\main.png");
			img_Grass = LoadGraph("textures\\entity\\grass\\main.png");
これは、ゲームを初期化する関数の一部なのですが、

コード:

//素材の読み込み
(L60)の下にある
音楽リソースの読み込みでBGM[0]とBGM[1]にエラーコードである-1が代入されてしまいます。
音楽ファイルの存在も確認できましたし、スペルも間違っては居ないと思います。

更に不可解なことに、読み込む前に存在している音楽データを適当に読み込めば、BGM[0]とBGM[1]には識別コードが代入されます。例↓

コード:

//素材の読み込み
		InitSoundMem();
		LoadSoundMem("textures\\bgm\\bgm-1.mp3");
		//音楽
		BGM[0] = LoadSoundMem("textures\\bgm\\bgm-1.mp3");
		BGM[1] = LoadSoundMem("textures\\bgm\\bgm-2.mp3");
		BGM[2] = LoadSoundMem("textures\\bgm\\bgm-3.mp3");
		BGM[3] = LoadSoundMem("textures\\bgm\\bgm-4.mp3");
これだと読み込めます。

誰か原因を教えてください。
お願いします。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: DxLibでリソースが正しく読み込まれない

#2

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

う~ん、そんなはずないと思いますけどねぇ・・。
もしこれが本当ならDXライブラリの不具合かもしれません。
DXライブラリを最新にして試してみて、それでも現象が起きるようならDXライブラリの管理人さんに聞いてみて下さい。
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?

なお、Debugコンパイルでブレイクポイントをはって1行ずつ確かめてみましたか?

# パスは「\\」で区切らなくても「/」で行けますよ。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DxLibでリソースが正しく読み込まれない

#3

投稿記事 by みけCAT » 10年前

直接は関係ないかもしれませんが、
Aozora0630 さんが書きました:

コード:

			//アイテム画像ロード
			char *fn = "";
			fgets(fn,100,ItemImageCSV);
ここは書き換えできない可能性のある文字列リテラルにファイルの内容を読み込もうとしている上、
1バイトしかない領域に最大100バイトのデータを書き込む、非常に危険そうなコードだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DxLibでリソースが正しく読み込まれない

#4

投稿記事 by みけCAT » 10年前

Aozora0630 さんが書きました:

コード:

			char *dm = "";
			if(fgets(dm,150,ItemNameCSV)==NULL)break;

コード:

			//アイテム名取得
			char *ItemName = "";fgets(ItemName,50,ItemNameCSV);
ここにも同様の問題があります。
ちなみに、Wandbox

コード:

#include <cstdio>

int main(void) {
    char *a="";
    fgets(a,100,stdin);
    puts(a);
    return 0;
}
というコードを実行し、入力"hogefuga(改行)"を与えると、Segmentation faultになりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: DxLibでリソースが正しく読み込まれない

#5

投稿記事 by Aozora0630 » 10年前

みけCAT さんが書きました:
Aozora0630 さんが書きました:

コード:

			char *dm = "";
			if(fgets(dm,150,ItemNameCSV)==NULL)break;

コード:

			//アイテム名取得
			char *ItemName = "";fgets(ItemName,50,ItemNameCSV);
ここにも同様の問題があります。
ちなみに、Wandbox

コード:

#include <cstdio>

int main(void) {
    char *a="";
    fgets(a,100,stdin);
    puts(a);
    return 0;
}
というコードを実行し、入力"hogefuga(改行)"を与えると、Segmentation faultになりました。
みけCAT さんが書きました:直接は関係ないかもしれませんが、
Aozora0630 さんが書きました:

コード:

			//アイテム画像ロード
			char *fn = "";
			fgets(fn,100,ItemImageCSV);
ここは書き換えできない可能性のある文字列リテラルにファイルの内容を読み込もうとしている上、
1バイトしかない領域に最大100バイトのデータを書き込む、非常に危険そうなコードだと思います。
お二人とも、ありがとう御座います。
実は、fgetsは文字列を格納しているポインタを返しているのだとずっと思っていました。
ブラウザと開発環境を立ち上げたらかなり重いので今度結果を報告します。
応えてくださった方、ありがとう御座いました。

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: DxLibでリソースが正しく読み込まれない

#6

投稿記事 by Aozora0630 » 10年前

解決しました!
ありがとう御座いました。

閉鎖

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