2016-08-26 10 views
1

私はhello worldで始まったので、少しだけ拡張しようとしました。メソッド呼び出しの順番が混じっています

import std.stdio; 
import core.thread; 

void main(string[] args){ 
    writeln("Hello World!"); 
    Thread.sleep(dur!("seconds")(5)); 
    writeln("Press enter key to exit..."); 
    writeln(readln()); 
} 

ので、私は私の出力は、次の

Hello World! 
Press enter key to exit... 
//input "abcd" 
abcd 

ことを期待するが、代わりに、私はこの

//input "abcd" 
Hello World! 
Press enter key to exit.... 
abcd 

スリープ機能にもスキップしますを取得します。 何が起こっていますか?

+0

は問題ありません。どのバージョンのコンパイラを使用しますか?どのようにしてこのコードをビルドして実行するのですか? – Kozzi11

+0

gdc --versionはバージョン5.4.0 20160609と言っています。私はx86_64のために別のビルドモードでコンパイルしています。 – blipman17

答えて

6

これはよくある質問です。タイトルを読んだときにIDEが表示され、そのタグが付いていると思われました。私は古い答えを見つけることができませんが、出力と睡眠は短く、IDEパイプでバッファリングされ、最後まで見えません。

あなたが追加した場合は、出力表示されますstdout.flush();readlnの前および/または右の最初のwriteln後 - 何かを行う前の画面に移動するには、バッファを強制します。

普通のコンソール出力は自動的に1行でフラッシュされますが、IDEはパイプとして見えます。プログラムはユーザーの代わりに別のプログラムと話しているので、ユーザーが見える行ではなくデータブロックでバッファリングできると考えています。

+0

私はナッツに行くと思っていました。私はそれが* writeln()*と呼ばれているので、バッファーではないことを期待していました(この関数を使用しているときには、1行を書くことを明確にしたいと思います)。 – blipman17

+0

ええ、私たちはwriteln呼び出しでフラッシュすることを検討しましたが、パイプやその他のファイルと通話するときにバッファリングが大きなパフォーマンスを引き出すので、ほとんどの場合正しい処理をしています...彼らが図書館にいるもののように見えません。 –

+0

私は '' writeln''と '' writeln''の2つの異なるバージョンをflushに組み込んだり、作り直したりしないという提案を思いついたと思います。 私が尋ねることができるなら、それをしない代わりに何をしたらいいのですか? – blipman17

関連する問題