このコード
fwrite(fileName, sizeof(char), sizeof(boardState->board.theBoard), file);
は意味:
書き込みデータをファイルfile
に。データはfileName
を指すメモリ位置にあり、データはsizeof(boardState->board.theBoard)
の項目から構成され、すべての項目はsizeof(char)
バイトです。
これは正しいですか?私はそうは思わない;あなたがファイルにボードデータを書いて、ファイル名を書こうとしていないので、fileName
の位置にデータが見つかるのは間違いです。
sizeof()
にも注意してください。 sizeof()
は、一部のメモリの内容を動的に決定することはできません。静的メモリのサイズしか知りません。例えば。
char test[20];
size_t s = sizeof(test);
s
は20となる。しかし、今、この考えてみます。ポインタのサイズは通常サイズが4バイトまたは8つのバイトとしてs
今
char test[20];
char * ptr = test;
size_t s = sizeof(ptr);
は、4または8となります。 sizeof()
は、ポインタが指しているメモリのサイズではなく、ここにポインタのサイズを与えます。ポインタが指し示すメモリブロックのサイズを得る方法はCにありません。このサイズは常に知られていなければなりません。
あなたのボードはchar ** theBoard
だから、theBoardはメモリまたは文字へのポインタの配列へのポインタです。その場合
theBoard -> [0] -> ['a1', 'b1', 'c1', 'd1', ... ]
[1] -> ['a2', 'b2', 'c2', 'd2', ... ]
[2] -> ['a3', 'b3', 'c3', 'd3', ... ]
:
作成コードは、([1]、...ロー[0]、と仮定して)そのように見える必要があるだろう:
theBoard = calloc(numberOfRows, sizeof(char *));
for (size_t i = 0; i < numberOfRows; i++) {
theBoard[i] = calloc(numberOfCols, sizeof(char));
}
その場合は行ごとにデータを書き込む必要があります。
for (size_t row = 0; row < numberOfRows; row++) {
fwrite(boardState->board.theBoard[row], sizeof(char), numberOfCols, file);
}
もちろん、すべての行の列数が同じであるとします。
私はあなたにチップを与えることができる場合は、ボードchar **
を作ってはいけません。ちょうどそれがchar *
になります。お使いのボードが20x30(20行、30のcolsの)であれば、あなたはこのようなあなたのボードを定義することができ、参照してください:
char * theBoard = calloc(numberOfRows * numberOfCols, sizeof(char))
今、あなたはちょうどこのような単一のアレイ、持っている:
どう
theBoard -> ['a1', 'b1', 'c1', 'd1', ... ,
'a2', 'b2', 'c2', 'd2', ... ,
'a3', 'b3', 'c3', 'd3', ... ,
:
]
を特定のフィールドにアクセスしますか?非常に単純:
int row = 5;
int col = 8;
char field = theBoard[(row * numberOfCols) + col];
そして、あなたは1回の呼び出しでボード全体を書き込むことができます。
fwrite(theBoard, sizeof(char), numberOfRows * numberOfCols, file);
を参照してください、はるかに簡単。 char **
アプローチを使用しているとき、あなたの代わりにこれをしなければならないのに対し、また、あなただけのfree(theBoard);
を呼び出すことによって、基板全体を解放することができます
for (size_t i = 0; i < numberOfRows; i++) {
free(theBoard[i]);
}
free(theBoard);
は、どのようなエラーの種類は?それがちょうど正しく保存されていない場合、それは 'sizeof'' char ** 'が4または8(またはそのようなもの)であるためです。保存またはロードする文字セルの数を計算する必要があります: 'boardState-> board.numRows * boardState-> board.numCols'。 –
'char * fileName = NULL; scanf( "%s"、fileName); ' - あなたは' fileName'のための記憶域を割り当てていません....また、 '%s'ディレクティブ_は空白スペースをスキップします。書式文字列 –
「BoardState」とは何かによって異なります。しかし、 'fwrite(fileName、sizeof(char)、sizeof(boardState-> board.theBoard)、file);'とにかく完全に間違っています。 'fwrite(boardState、sizeof(char)、sizeof(boardState-> board.theBoard)、file)を意味しましたか? –