0

ANSI C と OpenMPI ライブラリを使用しています。

私はこのコードを持っています:

if(myRank == 0)
{
    printf("\n\tEnter bright: ");
    scanf("%d", &bright);
}

しかし、プログラムを実行すると、最初にキーが押されるのを待ち(scanf)、次にprintfになります。何が起こっているのか本当にわかりません。

ありがとうございました。

4

2 に答える 2

1

これは特に MPI とはほとんど関係がなく、ごく普通の Unix I/O 動作です。標準出力ストリームはline bufferedです。これは、ストリーム内で新しい行が検出されるか、フラッシュ操作が強制されない限り、基になる I/O サブシステムに何も送信されないことを意味します。

以下を比較してください:printf("asdasd");printf("asdasd\n");. 最初のケースでasdasdは、ストリームのバッファに追加されstdoutますが、そこには新しい行がないため、バッファはフラッシュされず、実際には何も端末に送信されません。2 番目のケースasdasdでは、出力ストリームに追加され、新しい行が存在すると自動的にフラッシュされるため、asdasd<new line>すぐに表示されます。John Zwinck によって既に示されているようにfflush(stdout);、ストリーム バッファを強制的にフラッシュするために使用できます。

Windows バックグラウンドから来た場合、そこにある標準出力は行バッファリングされず、次の明示的なフラッシュ操作なしで出力されることにprintf("asdasd");注意してください。adsasdただし、Windows でも、MPI の I/O リダイレクション メカニズムがライン バッファリングされている可能性があります。

于 2013-11-09T11:28:03.997 に答える
0

そのような方法で scanf を使用することが理にかなっているのかどうか、最初に疑問に思います (複数のプロセスが関係します。それらのいずれかが端末/キーボードに接続されることをどのように知っているか、または想定しているのでしょうか?)。とにかく、印刷後にフラッシュしてみてください:

printf("\n\tEnter bright: ");
fflush(stdout);
scanf("%d", &bright);
于 2013-11-09T04:03:55.737 に答える