初期化の途中でデータが消えてしまう

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

初期化の途中でデータが消えてしまう

#1

投稿記事 by wasawasa » 11年前

下記のような、while1ループ毎に1づつ加算させる変数m=0を使ってtxtファイルや画像ファイルからデータを取り込んで構造体Mapの変数を初期化する関数を書いたのですが正常に初期化がされません。ブレークポイントを設定して変数の中身を覗いたところ、「ここから」とコメントを入れた行から「ここまで」とコメントを入れた行までの間に0<=m<=9の時に変数に入れたデータが消えてしまっているようです。
何故データが消えてしまうのでしょうか?どなたか詳しい方はよろしくお願いします。

コード:

#define MapSizeMax 600//マップ行列最大値
#define MapKindMax 5//マップの数
struct MapData{
	int tile[3][MapSizeMax];
	int Ntile;//ノーマルタイルID
	int ATile[7];//オートタイルID
	int xsize,ysize;//横幅、縦幅
	int fog_alpha;//α値
	int fog_blend;//合成方法(0:通常,1:加算,2:減算)
	int fog_zoom;//拡大率
	int fog_sx,fog_sy;//スクロール速度
};
struct MapData Map[MapKindMax];
int panoramapic[MapKindMax];//パノラマ画像
int fogpic[MapKindMax];//フォグ画像

void Map_ini(){
	int file,i,n=0,m=0,ed=0;
    int text[32];
    char textc[32];
	char FPass1[] = "./Data/Pics/Fogs/";
	char FPass2[] = "./Data/Pics/Panoramas/";
	char Exten[] = ".png";
	char pass[64];
	//-マップデータの読み込み-
    file = FileRead_open( "./Data/Txt/MapData.txt" ) ;
    if(file==NULL){printfDx("read error\n");return;}
    while(1){
        for(i=0;i<32;i++){
            text[i] = FileRead_getc(file);
            textc[i] = text[i];
            if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
            if(text[i]==',' || text[i]=='\n' || text[i]=='\r'){
                if(i==0){i=-1;continue;}
                else{textc[i]='\0';break;}
            }
            if(text[i]==EOF){ed=1;break;}
        }
        if(ed==1){FileRead_close(file);break;}
		if(m==0){
			Map[n].Ntile = atoi(textc);
		}
		else if(m>=1&&m<=7){
			Map[n].ATile[m-1] = atoi(textc);
		}
		else if(m==8){//横幅
			Map[n].xsize = atoi(textc);
		}
		else if(m==9){//縦幅
			Map[n].ysize = atoi(textc);
		}
		else if(m>=10&&m<MapSizeMax+10){//タイル情報(Z=0)
			Map[n].tile[0][m-10] = atoi(textc);
		}
		else if(m>=MapSizeMax+10 && m<2*MapSizeMax+10){//タイル情報(Z=1)
			Map[n].tile[1][m-MapSizeMax+10] = atoi(textc);
		}
		else if(m>=2*MapSizeMax+10 && m<3*MapSizeMax+10){//タイル情報(Z=2)
			Map[n].tile[2][m-2*MapSizeMax+10] = atoi(textc);
		}//---ここから--------------------------------------------------------------
		else if(m==3*MapSizeMax+10){//パノラマ画像
			if(textc=="nil"){
				panoramapic[n]=MakeGraph( 640 , 480 ) ;
			}
			else{
				strcpy(pass,FPass2);strcat(pass,textc);strcat(pass,Exten);
				panoramapic[n] = LoadGraph(pass);
				memset(pass, 0, sizeof(pass));
			}
		}
		else if(m==3*MapSizeMax+11){//フォグ画像
			if(textc=="nil"){
				fogpic[n]=MakeGraph( 640 , 480 ) ;
			}
			else{
				strcpy(pass,FPass1);strcat(pass,textc);strcat(pass,Exten);
				fogpic[n] = LoadGraph(pass);
				memset(pass, 0, sizeof(pass));
			}
		}//--ここまで-----------------------------------------------------------
		else if(m==3*MapSizeMax+12){//フォグ透明度
			Map[n].fog_alpha = atoi(textc);
		}
		else if(m==3*MapSizeMax+13){//フォグ合成法
			Map[n].fog_blend = atoi(textc);
		}
		else if(m==3*MapSizeMax+14){//フォグ拡縮倍率
			Map[n].fog_zoom = atoi(textc);
		}
		else if(m==3*MapSizeMax+15){//フォグスクロール速度(x方向)
			Map[n].fog_sx = atoi(textc);
		}
		else if(m==3*MapSizeMax+16){//フォグスクロール速度(x方向)
			Map[n].fog_sy = atoi(textc);
		}
		else{
			m=0;
			n++;
			continue;
		}
		m++;
    }
}

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

Re: 初期化の途中でデータが消えてしまう

#2

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

指定された範囲からは外れていますが、55行目~59行目を

コード:

        else if(m>=MapSizeMax+10 && m<2*MapSizeMax+10){//タイル情報(Z=1)
            Map[n].tile[1][m-MapSizeMax-10] = atoi(textc);
        }
        else if(m>=2*MapSizeMax+10 && m<3*MapSizeMax+10){//タイル情報(Z=2)
            Map[n].tile[2][m-2*MapSizeMax-10] = atoi(textc);
としたらどうなりますか?

また、62行目と72行目の条件式も不自然だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: 初期化の途中でデータが消えてしまう

#3

投稿記事 by wasawasa » 11年前

みけCATさん返信ありがとうございます。
55行目~59行目を助言された通りに変えてみたところ、n=0の時の初期化は上手くいくようになりました。
ただm==3*MapSizeMax+16からm==0になる過程でデータを一つ飛ばしてしまっているみたいでn=1以降は一つずつずれてしまっています。
丸投げしているようで非常に申し訳ないのですが、ここからは多分txtファイルの記述方式も関連した問題になっているみたいなのでデータの読み込み元となるMapData.txtとその記述方式を上げておきます。

コード:

//map行列最大値:600  マップの数:5
//Map○
NTile,ATile[0],ATile[1],ATile[2],ATile[3],ATile[4],ATile[5],ATile[6],xsize,ysize
/Z = 0
tile[0][0],tile[0][1],……,tile[0][xsize]
tile[0][xsize+1],tile[0][xsize+2],……,tile[0][2*xsize]
     :
……,tile[0][ysize*xsize]
,0,0,……0 ←ysize*xsizeがmap行列最大値より低い場合その差だけ0が並ぶ
/Z = 1
tile[1][0],tile[1][1],……
     :
……,tile[1][ysize*xsize]
,0,0,……0 ←ysize*xsizeがmap行列最大値より低い場合その差だけ0が並ぶ
/Z = 2
tile[2][0],tile[2][1],……
     :
……,tile[2][ysize*xsize]
,0,0,……0 ←ysize*xsizeがmap行列最大値より低い場合その差だけ0が並ぶ
panoramapic[n]に格納する画像名(空値の場合はnil)
fogpic[n]に格納する画像名(空値の場合はnil),fog_alpha,fog_blend,fog_zoom,fog_sx,fog_sy
//Map○
           :

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

Re: 初期化の途中でデータが消えてしまう

#4

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

wasawasa さんが書きました:ただm==3*MapSizeMax+16からm==0になる過程でデータを一つ飛ばしてしまっているみたいでn=1以降は一つずつずれてしまっています。
プログラムがそのように書いてあるからですね。
95~96行目

コード:

        }
        else{
を削除してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 初期化の途中でデータが消えてしまう

#5

投稿記事 by box » 11年前

wasawasa さんが書きました:

コード:

			if(textc=="nil"){
			if(textc=="nil"){
ここの記述が不自然であるという指摘には、
どのようにお応えになりますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 初期化の途中でデータが消えてしまう

#6

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

とりあえずロジックが複雑なのでバグになりやすいと思います。その上メンテナンス性も悪いです。
直値が多い事もバグの原因となります。
マップの仕様を、もう少し簡単に読めるように改められた方が良い様に思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wasawasa
記事: 94
登録日時: 11年前

Re: 初期化の途中でデータが消えてしまう

#7

投稿記事 by wasawasa » 11年前

>>みけCATさん
無事正常に初期化できるようになりました。ありがとうございます。

>>boxさん
文字列による条件分岐について調べたところ、下記のような記述でやりたい事ができると分かったので修正しました。返答が遅れてしまい申し訳ございません。

コード:

strcmp(textc,"nil")==0
>>softya(ソフト屋)さん
そうですね、それは自分で弄っていてよく分かったのでこれから改善していきたいと思います。
ファイルは別途ツールで生成しているのですが、その生成方式をtxtからcsvに変更してそれに対応した#define での定義文を同時に吐き出させる事ができれば少しは楽になるかなー・・・という感じに今のところは薄っすら考えています。

閉鎖

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