0

私はこれらの2つの機能を持っています

    void set_dram_channel_width(int channel_width){
      printf("one\n");
          getchar();
    }


    void set_dram_transaction_granularity(int cacheline_size){
      printf("two\n");
          getchar();
    }
    //output:
    one
    f //my keyboard input
    two
    one
    f  //keyboard input
    two
    one
    f  //keyboard input
    //No more calls

次に、関数を次のように変更します。

    void set_dram_channel_width(int channel_width){
      printf("one\n");
    }


    void set_dram_transaction_granularity(int cacheline_size){
      printf("two\n");
      getchar();
    }
    //output
    one
    two 
    f //keyboard input
    //No more calls 

どちらの関数も外部コードによって呼び出されます。両方のプログラムのコードは同じですが、getchar() を変更するだけで、2 つの異なる出力が得られます。これは可能ですか、それとも私のコードに何か問題がありますか?

ありがとう

これは私がGDBで得た出力です**

最初のコードの場合

(gdb) break mem-dram.c:374
Breakpoint 1 at 0x71c810: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
(gdb) break mem-dram.c:381
Breakpoint 2 at 0x71c7b0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 381.
(gdb) run -d ./tmp/MyBench2/ 
one
f
[Switching to Thread 47368811512112 (LWP 17507)]

Breakpoint 1, set_dram_channel_width (channel_width=64)
(gdb) c
Continuing.
two
one
f

Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
(gdb) c
Continuing.

Breakpoint 1, set_dram_channel_width (channel_width=8)
374     void set_dram_channel_width(int channel_width){
(gdb) c
Continuing.
two
one
f

2 番目のコードの場合

(gdb) break mem-dram.c:374
Breakpoint 1 at 0x71c7b6: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
(gdb) break mem-dram.c:380
Breakpoint 2 at 0x71c7f0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 380.
(gdb) run
one
two
f
[Switching to Thread 46985688772912 (LWP 17801)]

Breakpoint 1, set_dram_channel_width (channel_width=64)
(gdb) c
Continuing.

Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
(gdb) c
Continuing.

Breakpoint 1, set_dram_channel_width (channel_width=8)
(gdb) c
Continuing.
4

1 に答える 1

5

外部コードを (まだ?) 提供していないので、ここで推測します。

while(some condition) {
    foo1();
    foo2();
}
  • foo1 は ' one' を出力し、何らかの入力を待ちます。「f[enter]」と入力します。
  • foo1 は ' f' を消費します。
  • foo2 は 'two' を出力し、[enter](改行文字) を消費します。
  • その後、最初に戻ると、すべてが再び起こります。

2 番目のバージョンでは、foo1() は何も読み取らなくなりました。

そう:

  • foo1 は ' one'を出力します
  • foo2 は ' two' を出力し、何らかの入力を待ちます。「f[enter]」と入力します
  • foo2 は「f」を消費します

残っている唯一の問題は、停止したときに停止する理由です。(some condition)そのためには、実際に何があるかを確認する必要があります。

getchar()( のように) 結果を保持せずに呼び出すことはかなり珍しいことに注意してくださいc = getchar();。これを行う理由はありますか?

便利な C イディオムは次のとおりです。

(void) getchar(); 

void へのキャストは、プログラマーが戻り値を破棄していることを認識していることを示しています。

于 2009-03-22T21:46:55.670 に答える