Bonjour, je suis débutant en train d'apprendre le C, donc excusez moi si ma question vous parait idiote (on dit chez moi que le ridicule ne tue pas).
J'utilise gcc 4.0.1 sous Mandriva pour les détails.
Voila, donc j'essayais de comprendre comment pouvaient être interprétées des erreurs de programmaion au niveau des portées des variables avec un petit programme que voici
Voici la version 1 du programme :
Code variable_globale_main.c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdlib.h> #include "variable_globale.h" float globale; int main(void) { variable_globale_afficher(); globale = 132456789.0; variable_globale_afficher(); return EXIT_SUCCESS; }
Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <stdio.h> #include "variable_globale.h" extern int globale; void variable_globale_afficher(void) { printf("globale = %d\n", globale); }
Code variable_globale.h : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #ifndef VARIABLE_GLOBALE_H #define VARIABLE_GLOABLE_H extern void variable_globale_afficher(void); #endif /* VARIABLE_GLOBALE_H */
Résultat obtenu :
Là, ok, y a pas de problème, étant donné que la variable est donnée comme étant float dans variable_globale_main.c et traitée comme int dans variable_globale.c, il est tout à fait normal, comme le codage est différent, que la variable soit "mal affichée".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 globale = 0 globale = 1291625515
Mais voici la version 2 de mon programme ou je ne change que variable_globale.c
Code variable_globale.c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <stdio.h> #include "variable_globale.h" extern int globale; void variable_globale_afficher(void) { printf("globale = %f\n", globale); }
Alors la, le résultat me surprend
Déjà, dès la compilation, j'obtiens ce message d'erreur :
Je ne comprends pas, je n'obtenais aucune erreur lors de la première version qui, dans le second appel de fonction, prend un float pour le mettre en int (avec %d). Pourquoi ce message d'erreur là et pas dans la première version ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 [revenge@localhost 02_declarations]$ gcc -g -W -Wall variable_globale_main.c variable_globale.c -o variable_globale variable_globale.c: In function 'variable_globale_afficher': variable_globale.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'int'
La aussi, je ne comprends pas, je mets deux valeurs différentes et j'obtiens deux valeurs identiques qui, en plus de ca, diffèrent a chaque exécution du programme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 [revenge@localhost 02_declarations]$ ./variable_globale globale = -0.400362 globale = -0.400362 [revenge@localhost 02_declarations]$ ./variable_globale globale = -0.012160 globale = -0.012160 [revenge@localhost 02_declarations]$ ./variable_globale globale = -0.819881 globale = -0.819882 [revenge@localhost 02_declarations]$ ./variable_globale globale = -0.023486 globale = -0.023486
Voila, donc si quelqu'un d'assez courageux pouvait m'expliquer comment cela se fait il ??? En gros, comment le compilateur gère la variable globale et quel type il lui donne pour chaque appel ?
En vous remerciant de votre attention !!
Partager