擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

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

擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#1

投稿記事 by ゴンマサ » 10年前

前回のマップチップの描画と移動に関する質問ではお世話になりました。
なんとか思い通りに動かすことができるようになりました。

今回もまた稚拙な内容かとは思いますが、ご教授いただければ幸いです。


以下のコードでは、テキストファイルからマップチップの配列を読み込もうとしています。
読み込むテキストファイルの内容は一番下に記載しています。

 記述の内容はダブルポインタを使い、strtokでテキストファイルから読み込んだ列を分割し、
MAP_SIZEをmapSizeX,Yに代入、ダブルポインタにDATAの列を分割して代入し、
for文を使って描画をしているつもりですが、
実行したところ、マップチップは表示されませんでした。

mapSizeX,Yに代入した値を表示するようにしたところ、どちらも0と表示され、
MAP_SIZEすら読み込まれてないことがわかりました。

strtokの使い方が間違っているのか、それともあちこちのサイトに書かれているコードを参考にしたものなので、
そもそもの記述の内容がめちゃくちゃになっていることに気がついていないだけのか、
いずれにしろ判別をつけることができません。

なにかアドバイスをいただけたらと思います。
よろしくお願い致します。



コード:

 
#include "DxLib.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

//ウインドウの横と縦の大きさ
#define GAME_WINDOW_WIDTH 640//32*20
#define GAME_WINDOW_HEIGHT 480//32*15

#define SCRIPT_FILENAME "map.txt"//読み込むファイル
#define MAPCHIP_SIZE 32//マップチップサイズ
#define LINE_1 256//動的擬似に次元配列の実験用定数

int map;//配列
int mapSizeY,mapSizeX;//読み取ったマップのサイズ
int **pp;//ダブルポインタの宣言
int ran;
int x,y;
int z;//DATA列の読み込みの可否

//動的擬似二次元配列を使った場合の
//マップスクリプトの読み込み
void LoadMapFile(char*Filename)
{

 char line[LINE_1];

 z=0;

 FILE*mapFile;
 mapFile = fopen(Filename,"r");

 while( fgets(line,LINE_1,mapFile))
 {
	 //wordsにlineをカンマで区切って格納する
	 char*words = strtok(line,",");

	 //ファイル内のキーワードを先頭からチェックし、振り分ける
	 if(strcmp("MAP_SIZE",words) == 0 && z == 0)
	 {
		 mapSizeY = atoi(strtok(NULL,","));//一つ目
         mapSizeX = atoi(strtok(NULL,","));//二つ目

		 //メモリの確保
		 int **pp = new int*[y];
		 for(int ran = 0; ran < y; ran++)
		 {
			 pp[y] = new int[x];
		 }

		 z = 1;//MAP_SIZE列の再読み込みを防ぐ
	 }
	 else if(strcmp("DATA",words) == 0)
	 {
		 for(x = 0; x < mapSizeX;x++)
		 {
			  map[&y][&x] = atoi(strtok(NULL,","));
			  y++;
		 }
	 }
 }

 fclose(mapFile);

}



//マップチップの描画
void Mapchipdraw()//ここで引数を使いyとxに代入する
{ //sizeofを削ると描画すらされない、mapSizeに値が代入されていない
  //おそらくsizeofでバイト数を調べているから変になる
  //なので訂正
	for(y = 0; y < mapSizeY; y++)
    {
	    for(x = 0; x < mapSizeX;x++)
		{
		    if(map[&y][&x]==0)
		    {

			    DrawBox(x*MAPCHIP_SIZE,
				        y*MAPCHIP_SIZE,
				        x*MAPCHIP_SIZE+MAPCHIP_SIZE,
			            y*MAPCHIP_SIZE+MAPCHIP_SIZE,
					    GetColor(255,255,255),
					    TRUE);
			}
		}
	}
}
		 

//メイン
int WINAPI WinMain( HINSTANCE hInstace, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	
	//ウィンドウモードで起動
	ChangeWindowMode( TRUE );
	//画面の大きさは800 * 600
    SetGraphMode( GAME_WINDOW_WIDTH, GAME_WINDOW_HEIGHT, 16 ) ;
	//DxLib初期化
    if( DxLib_Init() == -1 )
    {
		return -1;
	}
    //ここでマップテキストの読み込みと、擬似配列への代入
	LoadMapFile(SCRIPT_FILENAME);

	while(CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		ClearDrawScreen();
		//マップチップの描画
		Mapchipdraw();

		//デバッグ用
		DrawFormatString(0,180,GetColor(255,0,255),"mapSizeY%d",mapSizeY);
		DrawFormatString(0,200,GetColor(255,0,255),"mapSizeX%d",mapSizeX);

	    ScreenFlip();
	    WaitTimer(20);//これがないとボタンの反応が早すぎるため
	}

	DxLib_End();
	return 0;
}

 
//読み込むテキストファイルの内容

MAP_SIZE 15,10
DATA 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#2

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

ゴンマサ さんが書きました:mapSizeX,Yに代入した値を表示するようにしたところ、どちらも0と表示され、
MAP_SIZEすら読み込まれてないことがわかりました。
テキストファイルに必要なコンマが無いからだと思います。
テキストファイルの内容を

コード:

MAP_SIZE,15,10
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
にして読み込ませたらどうなりますか?
ゴンマサ さんが書きました:mapSizeX,Yに代入した値を表示するようにしたところ、どちらも0と表示され、
MAP_SIZEすら読み込まれてないことがわかりました。

strtokの使い方が間違っているのか、それともあちこちのサイトに書かれているコードを参考にしたものなので、
そもそもの記述の内容がめちゃくちゃになっていることに気がついていないだけのか、
いずれにしろ判別をつけることができません。

なにかアドバイスをいただけたらと思います。
よろしくお願い致します。
strtokが返している文字列も表示させてデバッグを行うといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ゴンマサ

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#3

投稿記事 by ゴンマサ » 10年前

みけCAT様

回答ありがとうございます。

テキストファイルのカンマを直したところ、mapSizeYは15として読み込まれました。
ありがとうございます
ですが、読み込まれたのはmapSizeYだけで、その後のmapSizeXは変わらず0のままで、代入されてないようでした。

デバッグの文字列表示のアドバイスありがとうございます。
試してみようと思います。

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#4

投稿記事 by amehirune » 10年前

テキストファイルの、3つ目のカンマがないような気がしますが…

コード:

MAP_SIZE,15,10(,)←ここ
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
strtok関数は使ったことがないので、解説のページを流し読みした程度ですが、
文字列を区切るカンマがない以上、きちんとデータは読み込まれないような気がします。

なんとなく思ったことなので、正しいかどうかはわかりませんが。間違ってたら申し訳ありません。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

ゴンマサ

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#5

投稿記事 by ゴンマサ » 10年前

いくつか修正してみた結果、最初の質問での58行目、

map[&y][&x] = atoi(strtok(NULL,","));

をアドレス指定することなく、変数でもビルドが通るようになりました。

mat[j] = atoi(strtok(NULL,","));

しかし今度はその場所で、デバッグが中断するようになってしまいました。
下記の68行目になります。

また、下記45行目のstrtokが機能しない点についても、まだよくわかりません。
なにかヒントを頂けたら幸いです。

お手数ですが宜しくお願い致します。

amehirune様
コメントありがとうございます。
仰るとおり、カンマが抜けておりました。
ですがテキストファイル一行目の終わりのカンマは、
下記コード45行目の読み込みには特に影響はないようでした。




コード:

#include "DxLib.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

//ウインドウの横と縦の大きさ
#define GAME_WINDOW_WIDTH 640//32*20
#define GAME_WINDOW_HEIGHT 480//32*15

#define SCRIPT_FILENAME "map.txt"//読み込むファイル
#define MAPCHIP_SIZE 32//マップチップサイズ
#define LINE_1 256//動的擬似に次元配列の実験用定数

int map;//配列
int mapSizeY,mapSizeX;//読み取ったマップのサイズ
int **mat;//ダブルポインタの宣言
int row,col;


//プロトタイプ宣言
void Mapchipdraw(int **,int,int);

//動的擬似二次元配列を使った場合の
//マップスクリプトの読み込み
void LoadMapFile(char*Filename)
{
int i,j;




 char line[LINE_1];

 FILE*mapFile;
 mapFile = fopen(Filename,"r");
 while( fgets(line,LINE_1,mapFile))
 {
	 //wordsにlineをカンマで区切って格納する
	 char*words = strtok(line,",");

	 //ファイル内のキーワードを先頭からチェックし、振り分ける
	 if(strcmp("MAP_SIZE",words) == 0 )
	 {
		 mapSizeY = atoi(strtok(NULL,","));//一つ目
         mapSizeX = atoi(strtok(NULL,","));//二つ目--読み込まれていない

		 //メモリの確保
		 int **mat = new int*[row];
		 for(i = 0; i < row; i++)
		 {
			 mat[i] = new int[col];
		 }
		 //**mat == *mat[row] == mat[row][col]

		 //値の設定   これがされていなかった
		 for(i = 0; i < row; i++)
		 {
			 for(j = 0;j<col;j++)
			 {
				 mat[i][j] = 10*(i+1)+(j+1);//この10はどこからきたのかわからない
			 }
		 }
	 }
	 else if(strcmp("DATA",words) == 0)
	 {
		 for(i = 0; i < mapSizeX;i++)
		 {
			  mat[i][j] = atoi(strtok(NULL,","));//ここで何かが起きて動かなくなる
			  j++;
		 }
	 }
 }
 
 //ここで領域の開放をする
 for(i=0;i<row; i++)
 {
	 delete[]mat[i];
 }
 delete[]mat;

 //ファイルを閉じる
 fclose(mapFile);

}



//マップチップの描画
//この関数自体は有効
void Mapchipdraw(int **a,int b,int c)//ここで引数を使いbとcに代入する
{ //sizeofを削ると描画すらされない、mapSizeに値が代入されていない
  //おそらくsizeofでバイト数を調べているから変になる
  //なので訂正
	int l,k;//i,j;y,x


	for(l = 0; l < b; l++)//b=mapSizeY
    {
	    for(k = 0; k < c;k++)//c=mapSizeX
		{
		    if(mat[l][k]==0)//ここでアドレスを指定しなければいけないこと事態が間違いなのでは
		    {

			    DrawBox(k*MAPCHIP_SIZE,
				        l*MAPCHIP_SIZE,
				        k*MAPCHIP_SIZE+MAPCHIP_SIZE,
			            l*MAPCHIP_SIZE+MAPCHIP_SIZE,
					    GetColor(255,255,255),
					    TRUE);
			}
		}
	}
}
		 

//メイン
int WINAPI WinMain( HINSTANCE hInstace, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	
	//ウィンドウモードで起動
	ChangeWindowMode( TRUE );
	//画面の大きさは800 * 600
    SetGraphMode( GAME_WINDOW_WIDTH, GAME_WINDOW_HEIGHT, 16 ) ;
	//DxLib初期化
    if( DxLib_Init() == -1 )
    {
		return -1;
	}
    //ここでマップテキストの読み込みと、擬似配列への代入
	LoadMapFile(SCRIPT_FILENAME);

	while(CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		ClearDrawScreen();
		//マップチップの描画
		Mapchipdraw(mat,mapSizeY,mapSizeX);

		//デバッグ用
		//マップの大きさ
		DrawFormatString(0,180,GetColor(255,0,255),"mapSizeY%d",mapSizeY);
		DrawFormatString(0,200,GetColor(255,0,255),"mapSizeX%d",mapSizeX);

		//ポインタによみこまれている列
		//DrawFormatString(0,220,GetColor(255,0,255),"マップ1段目%d",mat[i][j]);


	    ScreenFlip();
	    WaitTimer(20);//これがないとボタンの反応が早すぎるため
	}

	DxLib_End();
	return 0;
}
//読み込むテキストファイルの内容
(カンマ修正後)

MAP_SIZE,15,10,
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,

DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0,
DATA,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#6

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

rowやcolに値を代入していないので0のままであり、
matには0要素しか確保されていない(?)のに、
68行目でmat[2]等にアクセスすると、確保された領域の範囲外へのアクセスとなり、危険だと思います。
もちろんmat[0]やmat[1]もやばそうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#7

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

Mapchipdraw関数で開放された後の領域にアクセスしていることも、危険な気がします。
もちろん他の関数や、他の名前の関数でもアクセスするべきではありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#8

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

ついでにコードの匂いを指摘しておくと、14行目の「int map;//配列」は何のためにあるのでしょうか?
ぱっと見使われていないようですし、一般的にいう配列や、配列として使えるもの(動的確保された領域などへのポインタを保持する変数)ではないように見えます。
(N3337によると、このような「普通の」変数へのポインタは1要素の配列の先頭要素へのポインタとみなせるようですが)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ゴンマサ

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#9

投稿記事 by ゴンマサ » 10年前

みけCAT様

ご指摘ありがとうございます。
おおよその目星をつけることができました。
メモリの確保について勉強しなおそうと思います。

14行目の「int map;//配列」は削除のし忘れでした。
申し訳ありません。


ひとつお伺いしたいのですが、
投稿No.5のコード、42行目から45行目にかけてのstrcmpへの値の代入の記述についてですが、
テキストファイルのカンマを修正しただけで最初の投稿と内容は変えていないつもりです。

 それでも、mapSizeYにはテキストファイルの一行目の”15”が代入されるようになったのですが、
それに続くmapSizeXには”10”が代入されず、”0”と表示されます。

コード:

     if(strcmp("MAP_SIZE",words) == 0 )
     {
         mapSizeY = atoi(strtok(NULL,","));//一つ目
         mapSizeX = atoi(strtok(NULL,","));//二つ目--読み込まれていない

コード:

テキストファイルの一行目
MAP_SIZE,15,10,
この部分は、他のサイトを参考にしたものですが、
strcmpを使用した文字列の変数へ代入方法としては見当違いの記述なのでしょうか。

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#10

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

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
	char line[] = "MAP_SIZE,15,10,\n";
	int mapSizeY=0,mapSizeX=0;
	char*words = strtok(line,",");
	if(strcmp("MAP_SIZE",words) == 0 )
	{
		mapSizeY = atoi(strtok(NULL,","));
		mapSizeX = atoi(strtok(NULL,","));
	}
	printf("%d %d\n",mapSizeY,mapSizeX);
	return 0;
}
というコードを書き、Wandboxで実行すると、
期待通り15 10と表示されました。
したがって、strcmpやstrtokの使い方がおかしいということはなさそうだと思います。
何が原因なのでしょうか…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#11

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

さらに、No: 5のコードを危ない部分を無効化してコンパイル、実行したところ、正常に

コード:

mapSizeY15
mapSizeX10
という表示になりました。
ゴンマサ さんが書きました:投稿No.5のコード、42行目から45行目にかけてのstrcmpへの値の代入の記述についてですが、
そこで「strcmpへの値の代入」なんていう変なことは行われていないように見えます。(WebArchive)
添付ファイル
gizinizigennhairetu.zip
テスト用ソース・バイナリ・入力
(2.14 MiB) ダウンロード数: 117 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#12

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

ゴンマサ さんが書きました:

コード:

     if(strcmp("MAP_SIZE",words) == 0 )
     {
         mapSizeY = atoi(strtok(NULL,","));//一つ目
         mapSizeX = atoi(strtok(NULL,","));//二つ目--読み込まれていない

コード:

テキストファイルの一行目
MAP_SIZE,15,10,
この部分は、他のサイトを参考にしたものですが、
strcmpを使用した文字列の変数へ代入方法としては見当違いの記述なのでしょうか。
はい。「この部分」で変数に代入しているのは文字列ではなく数値であるため、
文字列の変数へ(の)代入方法としては見当違いの記述です。
念のため、参考にした「他のサイト」がどこだか教えていただくことはできないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ゴンマサ

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#13

投稿記事 by ゴンマサ » 10年前

みけCAT様
お時間を割いていただきありがとうございます。
大変勉強になります。

strtokを使った変数への値の代入の間違いでした。
申し訳ありません。

以下の二つが主に参考にしたサイトになります。
strtokの記述に関しては紅音製作所様のコードを主に使わせていただきました。

紅音製作所
http://www5.big.or.jp/~high/VENIO/kuz/kuz_are_02.htm

C/C++プログラミング
http://www.asahi-net.or.jp/~uc3k-ymd/Le ... 02_07.html

ゴンマサ

Re: 擬似二次元配列を使ったTxtファイルからのマップチップ配列の読み込み

#14

投稿記事 by ゴンマサ » 10年前

所要で席を離れるため、しばらくパソコンを扱えなくなりそうなので、
ここで一旦、解決とさせていただきます。

とても有意義な回答を頂くことができました。
回答者の皆様、お時間を割いていただき本当にありがとうございました。
特に、みけCAT様、とても親切にしていただきありがとうございます。

またの機会がありましたら、そのときは宜しくお願い致します。

閉鎖

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