当前位置:  开发笔记 > 编程语言 > 正文

使用getchar()和-O3的奇怪行为

如何解决《使用getchar()和-O3的奇怪行为》经验,为你挑选了1个好方法。

我有这两个功能

    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.

slim.. 5

既然你还没有提供外部代码(还有吗?),这就是猜测.

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)是什么.

请注意,在getchar()不保留结果的情况下调用是相当不寻常的(如c = getchar();).你有理由这样做吗?

一个有用的C语言是:

(void) getchar(); 

无效的演员表示程序员知道他们正在丢弃返回值.



1> slim..:

既然你还没有提供外部代码(还有吗?),这就是猜测.

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)是什么.

请注意,在getchar()不保留结果的情况下调用是相当不寻常的(如c = getchar();).你有理由这样做吗?

一个有用的C语言是:

(void) getchar(); 

无效的演员表示程序员知道他们正在丢弃返回值.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有