擬似二次元配列のメモリ確保について
Posted: 2015年3月01日(日) 17:16
閲覧いただきありがとうございます。
恥ずかしながら前回の質問とあまり進歩してない内容になってしまいますが、
ご教授いただければ幸いです。
質問の内容ではC++およびDXライブラリを使用しています。
またビルドは通っています。
前回の質問では、strtokを利用した読み込みができなかったのですが、
メモリを確保する記述を分けたところ、うまく機能しました。
ありがとうございました。
以下のコードの78行目で、ハンドルされていない例外が、発生してしまいます。
rowとcolには値が代入されているので、メモリは確保できていると思います。
となるとメモリへの値の代入の仕方が問題だと思うのですが、
見当がつかなくなってしまいました。
参考にした主なサイトは以下になります。
紅音製作所
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
何かヒントでもいただけたらと思います。
宜しくお願い致します。
読み込むテキストファイル
MAP_SIZE,15,10,
DATA,1,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,
恥ずかしながら前回の質問とあまり進歩してない内容になってしまいますが、
ご教授いただければ幸いです。
質問の内容ではC++およびDXライブラリを使用しています。
またビルドは通っています。
前回の質問では、strtokを利用した読み込みができなかったのですが、
メモリを確保する記述を分けたところ、うまく機能しました。
ありがとうございました。
以下のコードの78行目で、ハンドルされていない例外が、発生してしまいます。
rowとcolには値が代入されているので、メモリは確保できていると思います。
となるとメモリへの値の代入の仕方が問題だと思うのですが、
見当がつかなくなってしまいました。
参考にした主なサイトは以下になります。
紅音製作所
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
何かヒントでもいただけたらと思います。
宜しくお願い致します。
#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 mapSizeY,mapSizeX;//読み取ったマップのサイズ
int make_sure_of_memori;//メモリ確保の可否
//メモリ確保のための変数
int **mat;//ダブルポインタの宣言
int row;//matのポインタ
int col;//rowの中身
int i,j;//LoadMapFile内で使用、forのカウント用、メモリの確保用
int l,k;//Mapchipdraw内で使用、forのカウント用
int pox,poy;//配列を代入するときのカウント用
//プロトタイプ宣言
void Mapchipdraw(int **,int,int);
//ファイルの読み込み
void LoadMapFile(char*Filename)
{
char line[LINE_1];
poy = 0;//DATAの行数
FILE*mapFile;
mapFile = fopen(Filename,"r");
while( fgets(line,LINE_1,mapFile))//MAP_SIZEを読み込むためだけのループ、
//読み込みはこの一度で行わなければいけない
{
//wordsにlineをカンマで区切って格納する
char*words = strtok(line,",");
//ファイル内のキーワードを先頭からチェックし、振り分ける
if(strcmp("MAP_SIZE",words) == 0 )
{
//要素数に設定する値をファイルから読み込む
//この時点では要素数への代入までには至っていない
mapSizeY = atoi(strtok(NULL,","));//一つ目
mapSizeX = atoi(strtok(NULL,","));//二つ目--読み込まれていない
}
//配列を読み込む
else if(strcmp("DATA",words) == 0)
{
//DATA列を見つけたら最初にメモリを確保する
if(make_sure_of_memori == 0)
{
//要素数の代入
row = mapSizeY;//現在15
col = mapSizeX;//現在10
//newを使ったメモリの動的確保
int **mat = new int*[row];//rowというy軸行列、15のメモリ領域を確保
for(i = 0; i < row; i++)
{
mat[row] = new int[col];//colというx軸行列、10のメモリ領域を確保
}
//二回目以降はメモリの確保を繰り返さない
make_sure_of_memori = 1;
}
//x軸に列の内容をstrtokで読み込ませる
for(pox = 0; pox < mapSizeX;pox++)
{
mat[poy][pox] = atoi(strtok(NULL,","));//アクセス違反発生
//*(*(mat+poy)+pox) = atoi(strtok(NULL,","));//同じく発生
}
poy++;
}
}
//ファイルを閉じる
fclose(mapFile);
}//LoadMapFile関数の終わり
//マップチップの描画
//この関数自体は有効
void Mapchipdraw(int **a,int b,int c)//ここで引数を使いbとcに代入する
{
for(l = 0; l < sizeof(b); l++)//b=mapSizeY
{
for(k = 0; k < sizeof(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,240,GetColor(255,0,255),"メモリの確保row%d",row);
DrawFormatString(0,260,GetColor(255,0,255),"メモリの確保col%d",col);
ScreenFlip();
WaitTimer(20);//これがないとボタンの反応が早すぎるため
}
//ここで領域の開放をする
for(i=0;i<row; i++)
{
delete[]mat[i];
}
delete[]mat;
DxLib_End();
return 0;
}
MAP_SIZE,15,10,
DATA,1,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,