>>usaoさん
C言語のためmallocを扱うべきなのですが、newの方が安全という情報を多く目にしたためnewに切替えて試行錯誤しております。
コードに関しては過去に実行出来る状態で投稿させて頂いたのですが、質問外の箇所について手厳しいご意見を多く頂いてからトラウマが出来てしまい、見せるのをためらってしまってます・・・すみません・・・。
ポインタ構造体であるのに&でアドレスを見に行く必要はありませんでしたorz
fread,fwriteから&を取り除き
fread( user_data[0], sizeof(USER_DATA[2]), 1, file_p);
としました。
Saveで確保を行う前に解放を行っておりませんでした・・・。
おっしゃるようにかなり本末転倒というか迷走を始めてしまっていたので、元に戻し、現在
コード:
//ユーザーの構造体
typedef struct{
DATA test_data[2];
}USER_DATA;
static USER_DATA *user_data[2];
//ユーザー入力構造体
typedef struct{
int test;
}DATA;
static DATA input_user_data;
static int count[2];
void Init(){
//データがあればロードを行う
errno_t error_flag;
FILE *file_p;
int count = 0;
for( int i=0; i<2; i++){
/* ここでcountにデータから数値を読み込んでます */
//もしcountが0以外=データが存在していれば読み込む
if(count[i] > 0){
//データの読み込み
char pass[64] = {0};
sprintf_s(pass, 64, "user_data/data%d.dat",i+1);
if( (error_flag = fopen_s(&file_p,pass,"rb")) != 0 ){
}else{
//動的に要素数を確保する(事前に読み込んだcount+1分の要素数を確保した二次元配列構造体を作成したい)
user_data[i] = new USER_DATA[count[i]+1];
if(user_data[i] == NULL){
//エラー処理(エラーメッセージを表示させています)
return;
}
fread( user_data[i], sizeof(USER_DATA[2]), 1, file_p);
fclose(file_p);
}
}
}
}
void Save( int i){
//データの読み込み
char pass[64] = {0};
sprintf_s(pass, 64, "user_data/data%d.dat",i+1);
//データ数の増加
count[i]++;
//動的に確保する前に解放を行う
delete[] user_data[i];
user_data[i] = NULL;
//動的に要素数を確保する(データはどんどん増えていくのでcount+1の要素を確保し続ける)
user_data[i] = new USER_DATA[count[i]+1];
//データを構造体へ保存
user_data[i][count[i]-1].test_data = input_test_data;
errno_t error_flag;
FILE *file_p;
char pass[64] = {0};
sprintf_s(pass, 64, "user_data/data%d.dat",i+1);
if( (error_flag = fopen_s(&file_p,pass,"wb")) != 0 ){
}else{
if(user_data[i] == NULL){
//エラー処理
return;
}
fwrite( user_data[i], sizeof(USER_DATA[2]), 1, file_p);
fclose(file_p);
}
}
void Delete(){
for(int i=0; i<2; i++){
//もしメモリ確保が行われていたら解放
if(user_data[i] != NULL){
delete[] user_data[i];
user_data[i] = NULL;
}
}
}
という形で色々形を直してみましたが如何でしょうか・・・?
様々なバグは解決しましたが、一度保存処理を抜けた後に再起動するとInitのnew処理で
ハンドルされていない例外が発生しました: Microsoft C++ の例外: std::bad_alloc
というエラーが発生しており、現在原因を究明しております・・・・・orz