//ヘッダーのインクルード
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
BYTE **mapdata = { NULL };
//マップメイン関数
void MapMain(){
MapLoad( "マップ名.txt" , mapdata , 200 , 60 );
}
//マップロード用関数( 引数 1.ファイル名 2.読み込むデータ 3.読み込むデータのサイズ(横) 4.読み込むデータのサイズ(縦) )
BOOL MapLoad( char *test , BYTE **mapdata , int size_w , int size_h ){
HANDLE hFile = NULL;//ファイルハンドルの格納用
DWORD errchk;//エラーチェック用
int i=0 , j=0; //配列スコープ用
hFile = CreateFile(
test, //読み込むファイルパス
GENERIC_READ, //読込みモード
FILE_SHARE_READ, //他のファイルからの読込みを許可
NULL,
OPEN_EXISTING, //既存のファイルを開く(無ければエラー)
FILE_ATTRIBUTE_NORMAL, //通常属性
NULL );
//開けたかどうかを確認
if( hFile == INVALID_HANDLE_VALUE ){
return FALSE; //オープンに失敗していたら終了
}
//mallocを使ってメモリを動的に確保する
mapdata = (BYTE**)malloc(sizeof(BYTE*) * size_w );
for( i=0; i<size_w; i++ ){
mapdata[i] = (BYTE*)malloc(sizeof(BYTE) * size_h );
}
if( mapdata == NULL ){
printf( "メモリの確保に失敗!!\n" );
exit(-1);
}else{
printf( "メモリの確保に成功!!\n" );
}
//読み込みを行う
for( i=0; i<size_w; i++ ){
for( j=0; j<size_h; j++ ){
printf( "%d" , mapdata[i][j] );
//ファイルの読み込み
ReadFile( hFile , &mapdata[i][j] , size_w * size_h , &errchk , NULL );
if( j=size_h ){
break;
}
}
}
//ファイルポインタの位置を設定
//SetFilePointer( hFile, 0, NULL, FILE_BEGIN );
CloseHandle( hFile ); //ファイルを閉じる
//メモリを解放
for( int k=0; k<size_w; k++ ){
free( * ( mapdata + k ) );
}
free( mapdata );
return TRUE;
}
2.ファイルを読み込み
以上のように、ポインタのポインタを使ってマップ用のメモリを動的に確保しサイズの違うマップを読み込みたいのですが、実行は出来るのですが、「0x00000000 を読み取り中にアクセス違反が発生しました」となりエラーになってしまいます。
どうも調べてみると、OSのシステムがあるメモリを参照していてエラーになっているようなのですが、なぜそうなってしまうのかがわかりません。
使用中の自分のパソコンのスペックですが
OS : WindowsVista
コンパイラ名 : visual studio 2008
投稿初めてで、わかりやすく書けているか分かりませんが、よろしくおねがいします。