将棋所で動く思考エンジンのサンプルプログラムにLesserkaiというのがある。将棋所の作者のページからダウンロード出来るので、USIプロトコル対応のプログラムを書く上で公式のサンプルプログラムだと言っても過言ではないのだが、ちょっと困った問題がある。
このLesserkaiのmain関数の冒頭で次のように標準入出力のバッファリングを無効にしている部分がある。
1 2 3 4 |
int main() { setvbuf(stdout, NULL, _IONBF, 0); // これが必要(標準出力のバッファリングを無効にする) setvbuf(stdin, NULL, _IONBF, 0); // これは不要かもしれないけど念のため。 |
Visual C++の古いランタイムでは標準出力がリダイレクトされているときにflushを呼び出しても標準出力のバッファをすべて吐き出さないことがあったような気がしないでもないが(おそらく実装上のバグ)、いまやそんなことはないので、こんなことはする必要はない。
必要はないというか、Visual C++2015でこれをしてしまうと、iostreamを使った標準入力は、改行が二回来ないと入力されない気がする。詳しく調べていないので理由はよくわからないが、上のコードを書いては駄目だということは私はわかっている。
この件でうさ親さんがハマっていたようだ。他にもハマっている人がいるかと思うので記事にしておく。
. @dasapon17 if (cin->_cnt>0) return 1; をコメントアウト、代替コードもコメントアウト、入力のバッファリングを有効にしたら、現在正しく動いております。 ponderも正常に動いているようにみえますので、多分これで大丈夫かと。ありがとうです。
— Yasuhiro Ike (@YasuhiroIke) December 23, 2015
Visual Studio 2015はexpress edition(or community edition)なら無償で使えるし、この無償の環境で十分将棋ソフトが開発できるので、お勧めしたいのだが、上のように2015にupdateしたら(自分の作っている)将棋ソフトが動かなくなったという事案がなくはない。本記事が、その解決の一助になれば幸いである。
あと、本件に関して、詳しいことがわかる人がいればコメントお願いします。
わかんないっす。(開き直り!)
お客様のなかでわかる方はおられませんかー?
分かってたらハマってないっす。
WCSC26で導入されるフィッシャールールについて御意見下さい。
やねうら王も当然対応させますよね?(出場して欲しい直喩)
選手権については考え中です…。