2009-03-22 10 views
0

Je ces deux fonctionsComportement étrange à l'aide getchar() et -O3

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 

Puis-je changer les fonctions:

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 

Les deux fonctions sont appelées par un code externe, le code les deux programmes sont les mêmes, juste en changeant le getchar() j'obtiens ces deux sorties différentes. Est-ce possible ou il y a quelque chose qui ne va vraiment pas dans mon code?

Merci

Ceci est la sortie que j'obtiens avec GDB **

Pour le premier code

(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 

Pour le second code

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

afficher aussi le code externe –

+0

...par qui Neil signifie - nous devons voir main() – slim

+0

Vous n'avez pas donné les informations nécessaires. Plus précisément, nous ne pouvons pas voir le programme principal ou un autre code d'appel. On ne sait pas d'où vient le 'f' - c'est probablement ce que vous entrez sur le clavier, mais nous devons le savoir avec certitude. –

Répondre

5

Depuis toi n'a pas fourni le code externe (encore?), voici une conjecture.

while(some condition) { 
    foo1(); 
    foo2(); 
} 
  • imprime foo1 'one' attend ensuite une entrée. Vous tapez 'f[enter]'.
  • foo1 consomme le 'f'. Foo2 imprime 'deux' puis consomme [enter] (un caractère de retour à la ligne)
  • Ensuite, vous revenez au début, et tout se passe à nouveau.

Avec votre deuxième version, foo1() ne lit plus rien.

Alors:

  • imprime foo1 'one'
  • foo2 imprime 'two' attend ensuite une entrée. Vous tapez « f[enter] »
  • foo2 consomme le « f »

La seule question restante est pourquoi il arrête quand il le fait. Pour vous aider avec cela, nous devrions voir ce que (some condition) est réellement.

Notez qu'il est assez inhabituel d'appeler getchar() sans conserver le résultat (comme dans c = getchar();). Avez-vous une raison de le faire?

Un idiome C est utile:

(void) getchar(); 

Le casting d'annuler est une indication du programmeur qu'ils savent qu'ils rejeter la valeur de retour.

+0

C'est ce que je pensais qu'il arrivait mais attendait le code. Sans cela, c'est probablement la meilleure/la plus sûre. Tout le monde oublie à un moment ou un autre que ENTER == '\ n'. Prendre des paris si "une certaine condition" est! = EOF? –

+0

Peut-être mais aucune de ces fonctions ne retourne le caractère lu. Nous avons donc beaucoup de conjectures pour savoir où cette EOF serait lue. – slim

+0

En effet. Cela devrait être intéressant! –