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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
globale = 0
globale = 1291625515
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".

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 :
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'
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
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
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.

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 !!