標準入力のバッファリング問題

将棋所で動く思考エンジンのサンプルプログラムにLesserkaiというのがある。将棋所の作者のページからダウンロード出来るので、USIプロトコル対応のプログラムを書く上で公式のサンプルプログラムだと言っても過言ではないのだが、ちょっと困った問題がある。

このLesserkaiのmain関数の冒頭で次のように標準入出力のバッファリングを無効にしている部分がある。

Visual C++の古いランタイムでは標準出力がリダイレクトされているときにflushを呼び出しても標準出力のバッファをすべて吐き出さないことがあったような気がしないでもないが(おそらく実装上のバグ)、いまやそんなことはないので、こんなことはする必要はない。

必要はないというか、Visual C++2015でこれをしてしまうと、iostreamを使った標準入力は、改行が二回来ないと入力されない気がする。詳しく調べていないので理由はよくわからないが、上のコードを書いては駄目だということは私はわかっている。

この件でうさ親さんがハマっていたようだ。他にもハマっている人がいるかと思うので記事にしておく。

Visual Studio 2015はexpress edition(or community edition)なら無償で使えるし、この無償の環境で十分将棋ソフトが開発できるので、お勧めしたいのだが、上のように2015にupdateしたら(自分の作っている)将棋ソフトが動かなくなったという事案がなくはない。本記事が、その解決の一助になれば幸いである。

あと、本件に関して、詳しいことがわかる人がいればコメントお願いします。


標準入力のバッファリング問題” への5件のコメント

  1. WCSC26で導入されるフィッシャールールについて御意見下さい。
    やねうら王も当然対応させますよね?(出場して欲しい直喩)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です