特定フォルダ内のpngファイルを検索して検索したファイル名を[ファイル数][ファイル名文字数(256と設定。後からポインタによる確保に変更予定)]という形で動的に確保するchar型のFileName配列に取得する、という構想のプログラムを下記のように記述したところ57行目でFileName[0]に対してアクセス違反が発生してしまいました。FileName配列の確保方法を動的なものにする前はアクセス違反もエラーも無かったので24~25行目か51~56行目が原因だと思うのですが、デバッガを使って変数を覗いてみてもどこがおかしいのか判断できません。(FileName自体に格納されるのは配列へのハンドルだから覗いても意味ない?)
恐らく記憶領域の確保の方法が間違えているのだと思うのですが、一体どうすれば正常に領域を確保できるのでしょうか?
1次元配列にすれば管理が楽だという事は承知ですが、このプログラムは一応ポインタの扱いの練習としての意味合いがそれなりにあるのでFileNameを2次元配列という形で扱うという方針でお願いします。(多分1次元の管理すらできていないのだと思われますが)
#include "DxLib.h"
#include <windows.h>
#include <tchar.h>
#include <math.h>
#define MAXPATH 256
void hoge()
{
//フォルダ絶対パス検索用
int i,j;
int length; //プロジェクト実行ファイルパスサイズ
char *X; //[\]から[/]へ書き換え用
char delpath[] = "Debug\\DXlib_test.exe"; //消す文字列(サイズ測定用)
char picfol[] = "Data\\Pics\\TileA\\"; //目的フォルダ相対パス
char path[MAXPATH]={0}; //プロジェクトフォルダパス格納用
char picpath[MAXPATH]={0}; //picフォルダ絶対パス格納用
//ファイル検索用
WIN32_FIND_DATA fFind;
HANDLE hSearch;
char FindPath[MAXPATH] = {0};
char FindPng[] = "*.png";//pngファイル検索用
//画像名格納用
char **FileName;
char **FileName2;
int FileAmount;
//画像ハンドル格納用
char LoadPath[MAXPATH]={0};
int hpicture[100];
//picフォルダパス検出
length = GetModuleFileName(NULL, path, MAXPATH);
for(i=length-strlen(delpath); i<length; i++){
path[i] = '\0';
}
strcat(picpath,path);
strcat(picpath,picfol);
//ファイル検索
strcat(FindPath,picpath);
strcat(FindPath,FindPng);
hSearch=FindFirstFile(FindPath,&fFind); // 探索開始
//1個目が見つからない場合
if (hSearch==INVALID_HANDLE_VALUE) {// 見つからなければ探索終了
FindClose(hSearch);
return;
}
//1個目が見つかった場合
else{
i=1;
FileName2=(char**)malloc(sizeof(char*)*i);
for(j=0;j<i;j++){
FileName2[j]=(char*)malloc(sizeof(char*)*MAXPATH);
}
FileName=FileName2;
free(FileName2);
strcpy(FileName[0],fFind.cFileName);
//残りを検索
while (FindNextFile(hSearch,&fFind)) { /* 全ファイルを処理 */
i++;
FileName2=(char**)malloc(sizeof(char*)*i);
for(j=0;j<i;j++){
FileName2[j]=(char*)malloc(sizeof(char*)*MAXPATH);
}
for(j=0;j<i-1;j++){
strcpy(FileName2[j],FileName[j]);
}
FileName=FileName2;
free(FileName2);
strcpy(FileName[i],fFind.cFileName);
}
FileAmount=i;
}
FindClose(hSearch);
for(i=0;i<FileAmount;i++){
strcpy(LoadPath,picpath);
strcat(LoadPath,FileName[i]);
while(1){
X = strchr(LoadPath,'\\');
if(X != NULL){
*X = '/';
}
else{break;}
}
hpicture[i]=LoadGraph(LoadPath);
}
for(i=0;i<100;i++){
//DrawStringToHandle( 0, i*10, FileName[i], GetColor( 0, 255, 0 ),CreateFontToHandle( "メイリオ",10, 1, DX_FONTTYPE_ANTIALIASING_EDGE ) ); // 文字を描画する
DrawGraph( i*20 , i*20 , hpicture[i] , FALSE ) ;
}
ScreenFlip();
WaitKey() ;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
hoge();
/*while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
}*/
DxLib_End(); // DXライブラリ終了処理
return 0;
}