Странное поведение с использованием getchar () и -O3 - PullRequest
0 голосов
/ 23 марта 2009

У меня есть эти две функции

    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 () Я получаю эти два разных вывода Возможно ли это, или в моем коде действительно что-то не так?

Спасибо

Это вывод, который я получаю с 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

Для второго кода

(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.

1 Ответ

5 голосов
/ 23 марта 2009

Поскольку вы еще не предоставили внешний код (пока?), Вот предположение.

while(some condition) {
    foo1();
    foo2();
}
  • foo1 печатает 'one', затем ожидает некоторого ввода. Вы набираете 'f[enter]'.
  • foo1 потребляет 'f'.
  • foo2 печатает 'two', затем использует [enter] (символ новой строки).
  • Затем вы возвращаетесь к началу, и все это происходит снова.

В вашей второй версии foo1 () больше ничего не читает.

Итак:

  • foo1 печатает 'one'
  • foo2 печатает 'two', затем ждет некоторого ввода. Вы набираете 'f[enter]'
  • foo2 потребляет 'f'

Единственный оставшийся вопрос - почему он останавливается, когда это происходит. Чтобы помочь вам с этим, нам нужно посмотреть, что на самом деле является (some condition) 1035 *

Обратите внимание, что довольно необычно вызывать getchar() без сохранения результата (как в c = getchar();). У вас есть причина для этого?

Одна полезная идиома C:

(void) getchar(); 

Приведение к пустоте указывает программисту, что они знают, что отбрасывают возвращаемое значение.

...