CSA形式のデータ読み込み部 解説 その5
実際にN手目の局面をCSAファイルから読み出すコードとして、csa.cのread_recordという関数が非常に参考になるのでソースを引用して、ソースに私が注釈を入れておきますので読んでみてください。
ここまでの内容を理解していれば、すんなり読めるはずです。
int read_record( tree_t * restrict ptree, const char *str_file, unsigned int moves, int flag ) { record_t record; int iret; iret = record_open( &record, str_file, mode_read, NULL, NULL ); // CSAファイルのopen if ( iret < 0 ) { return iret; } // 戻り値がマイナスの値だと読み込みエラー if ( ! moves ) // movesは初期盤面からの手数。0が指定されていれば初期盤面 { iret = in_CSA_header( ptree, &record, flag ); // 初期盤面のみを読み込むときはin_CSA_header一発で終わり。 if ( iret < 0 ) { // 負の値ならば読み込みエラー。 record_close( &record ); return iret; } } else do { // 初期盤面からの手数が指定されているなら、その回数だけin_CSAを呼び出す。 iret = in_CSA( ptree, &record, NULL, flag ); if ( iret < 0 ) { // 負の値ならば読み込みエラー record_close( &record ); return iret; } } while ( iret != record_next && iret != record_eof && moves > record.moves ); // record_next : 次の棋譜が始まっている(?)の意味 // ( 指し手が続くときはrecord_miscが返ってくる。) // record_eof : ファイルが終端まで達した の意味 // record.moves : 現在の初期盤面からの手数 return record_close( &record ); }
これでBonanzaのCSA読み込み部に関してはすべて解説が終わりました。
CSA読み込み部の解説だけで5回も記事を書いてしまいました。
本当にゆっくりの解説ですみません。
何か質問がありましたらコメント欄でお願いします。