Bonsoir,
je voudrai comprendre s'il vous plait la raison de ce warning qui me suit partout dans mon programme:
possible use of "x" before definition in function main
Merci.
Version imprimable
Bonsoir,
je voudrai comprendre s'il vous plait la raison de ce warning qui me suit partout dans mon programme:
possible use of "x" before definition in function main
Merci.
A premiere vue, je dirais c'est parce que "x" est utilisé avant qu'il soit initialisé.
Ca sera plus claire si on pouvais avoir plus de details, comme le code et les messages de warning completsCode:
1
2
3
4 int i,j; j=i; printf("%d\n",j);
Merci, alors voilà mon code (pas encore terminé)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 #include <stdio.h> #include <stdlib.h> #include <conio.h> struct liste_event { char type; float temps; struct liste_event *next; }; struct liste_event *tete; /*fonction d'insertion*/ void insertion(char x, float y) { struct liste_event *pt1; struct liste_event *pt2; struct liste_event *event; printf ("saisie des informations du nouvel evennement"); printf ("/n entrez le type de l'evennement"); scanf ("%s", &x); printf ("entrez le temps d'execution du nouvel evennement"); scanf ("%f",&y); pt1=tete; event=(struct liste_event*)malloc(sizeof(struct liste_event)); event->type=x; event->temps=y; if (pt1==NULL){ /*insertion au debut*/ event->next=pt1; pt1=event; } else { pt2=tete->next; while (pt2->next!=NULL) { if(pt2->temps < event->temps) { pt1=pt2; pt2=pt2->next; } else { event->next=pt2; pt1=event; } } /*insertion en fin de liste*/ { pt1->next=event; event->next=NULL; } } } struct liste_event *extraire(void) { struct liste_event *p; struct liste_event *q; struct liste_event *event; p=tete; if (p==NULL) printf("liste vide"); else { tete=p->next; event=p; printf("l'evennement retir est:"); return(event); } } void affichage(void) { struct liste_event *courant; courant=tete; while (courant->next != NULL) { printf("/n le type de l'evennement est: %s", courant->type); printf("/n le temps de l'evennement est: %f", courant->temps); courant=courant->next; } } int menu(void) { int choix; clrscr(); gotoxy(10,2); printf("**********GESTION DE LA LISTE**********"); printf("/n 1-introduire un nouvel evennement"); printf("/n 2-Extraire le premier evennement"); printf("/n 3-Afficher le contenu de la liste des evennements"); printf("/n 4-EXIT"); printf("/n Faites votre choix"); scanf("%d", &choix); getch(); return(choix); } main() { int i; float val; char s; i=menu(); while (i != 4) { switch (i) { case (1):insertion(s,val); break; case (2):extraire(); break; case (3): affichage(); break; default: printf("\n choix inexistant"); } } }
Ton code a changer entre temps on dirait .... Le warning parlait d'une variable x dans la fonction main alors que dans ton code il n'y pas de variable x.
C'est quoi la fonction clrscr()? Mon compilo ne la reconnait pas.
Oui ça me rappelle la fonction pour programmer en c sur la TI89. Mais il y a 2 fonctions clrscr() et gotoxy() qui ne sont ni dans la librairie standard ni dans un entête quelconque. Je ne peux pas tester le programme.
Le warning est pourtant explicite: Ni val ni s ne sont initialisés, et tu appelles des fonctions dessus (en les passant par valeur)...
j'ai essayé de rajouter ça histoire de leur donner des valeurs mais ça ne marche toujours pas!
Code:
1
2
3
4 printf("entrez le type"); scanf("%s", s); printf("entrez le temps"); scanf("%f", val);
Tu ne sais visiblement pas te servir de scanf().
- s est UN char et non un tableau, et en plus c'est son adresse qu'il faut passer à scanf().
- c'est l'adresse de val qu'il faut passer à scanf().
Pour clrscr() et gotoxy(), c'est des fonctions dans conio.h a tous les coups ....
Il suffit de faire google de conio.h pour savoir que c'est une librairie de DOS et donc ya pas sur Linux.
SInon, tu pourrais poster le code ET les messages de compilations ? Genre a quelle ligne precisement il y a des Warnings ?
Dans la premiere version du code de acacia, il avait bien utilise scanf, avec des "&" ....
Bonjour,
je vous remercie pour vos réponses, j'ai corrigé ces erreurs sur le "scanf" et les types, et je n'ai plus de warning =)
Merci.
Voici mon code:
j'ai un petit soucis au moment de l'exécution, je n'arrive pas à voir le résultat de l'affichage de la liste :?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 #include <stdio.h> #include <stdlib.h> #include <conio.h> struct liste_event { char type; float temps; struct liste_event *next; }; struct liste_event *tete; /*fonction d'insertion*/ void insertion(char s, float val) { struct liste_event *pt1; struct liste_event *pt2; struct liste_event *event; pt1=tete; event=(struct liste_event*)malloc(sizeof(struct liste_event)); event->type=s; event->temps=val; if (pt1==NULL){ /*insertion au debut*/ event->next=pt1; pt1=event; } else { pt2=tete->next; while (pt2->next!=NULL) { if(pt2->temps < event->temps) { pt1=pt2; pt2=pt2->next; } else { event->next=pt2; pt1=event; } } /*insertion en fin de liste*/ { pt1->next=event; event->next=NULL; } } } struct liste_event *extraire(void) { struct liste_event *p; struct liste_event *q; struct liste_event *event; p=tete; if (p==NULL) printf("liste vide"); else { tete=p->next; event=p; printf("l'evennement retir est:"); return(event); } } void affichage(void) { struct liste_event *courant; courant=tete; while (courant->next != NULL) { printf("/n le type de l'evennement est: %s", courant->type); printf("/n le temps de l'evennement est: %f", courant->temps); courant=courant->next; } } int menu(void) { int choix; clrscr(); gotoxy(10,2); printf("**********GESTION DE LA LISTE**********"); printf("\n 1-introduire un nouvel evennement"); printf("\n 2-Extraire le premier evennement"); printf("\n 3-Afficher le contenu de la liste des evennements"); printf("\n 4-EXIT"); printf("\n Faites votre choix"); scanf("%d", &choix); getch(); return(choix); } main() { float val; char s; int choix; choix=2; while (choix!=4) { choix=menu(); { switch(choix) { case (1): printf("\n entrez le type de l'evennement"); scanf("%c",&s); printf("\n entrez le temps de l'evennement"); scanf("%f", &val); insertion(s,val); break; case (2):extraire(); break; case (3):affichage(); break; default: printf("\n choix inexistant"); } } } }
Je ne vois pas de problème avec 'x'...
Ton code commenté et partiellement corrigé :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Project : Forums Compiler : GNU GCC Compiler (called directly) Directory : C:\dev\forums\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.c main.c: In function `extraire': main.c:69: warning: unused variable `q' main.c:82: warning: control reaches end of non-void function main.c: In function `affichage': main.c:89: warning: format argument is not a pointer (arg 2) main.c: In function `menu': main.c:99: warning: implicit declaration of function `clrscr' main.c:100: warning: implicit declaration of function `gotoxy' main.c: At top level: main.c:113: warning: return type defaults to `int' main.c:113: warning: function declaration isn't a prototype main.c: In function `main': main.c:133: warning: control reaches end of non-void function main.c:115: warning: 'val' might be used uninitialized in this function main.c:116: warning: 's' might be used uninitialized in this function Linking console executable: console.exe Process terminated with status 0 (0 minutes, 7 seconds) 0 errors, 10 warnings
Il reste :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165 /* -ed- réindentation */ #include <stdio.h> #include <stdlib.h> /* -ed- a moins que tu compiles avec un vieux Borland C... */ #include <conio2.h> struct liste_event { char type; float temps; struct liste_event *next; }; struct liste_event *tete; /*fonction d'insertion*/ void insertion (char x, float y) { struct liste_event *pt1; struct liste_event *pt2; struct liste_event *event; printf ("saisie des informations du nouvel evennement"); printf ("/n entrez le type de l'evennement"); scanf ("%s", &x); printf ("entrez le temps d'execution du nouvel evennement"); scanf ("%f", &y); pt1 = tete; event = (struct liste_event *) malloc (sizeof (struct liste_event)); event->type = x; event->temps = y; if (pt1 == NULL) { /*insertion au debut*/ event->next = pt1; pt1 = event; } else { pt2 = tete->next; while (pt2->next != NULL) { if (pt2->temps < event->temps) { pt1 = pt2; pt2 = pt2->next; } else { event->next = pt2; pt1 = event; } } /*insertion en fin de liste*/ { pt1->next = event; event->next = NULL; } } } struct liste_event *extraire (void) { struct liste_event *p; /* -ed- non utilisée struct liste_event *q; */ struct liste_event *event; p = tete; if (p == NULL) printf ("liste vide"); /* -ed- BUG ! Ne retourne rien... */ else { tete = p->next; event = p; printf ("l'evennement retir est:"); return (event); } } void affichage (void) { struct liste_event *courant; courant = tete; while (courant->next != NULL) { /* -ed- printf ("/n le type de l'evennement est: %s", courant->type); Pour un char, c'est "%d" ou "%c"... */ printf ("/n le type de l'evennement est: %c", courant->type); printf ("/n le temps de l'evennement est: %f", courant->temps); courant = courant->next; } } int menu (void) { int choix; clrscr (); gotoxy (10, 2); printf ("**********GESTION DE LA LISTE**********"); printf ("/n 1-introduire un nouvel evennement"); printf ("/n 2-Extraire le premier evennement"); printf ("/n 3-Afficher le contenu de la liste des evennements"); printf ("/n 4-EXIT"); printf ("/n Faites votre choix"); scanf ("%d", &choix); getch (); return (choix); } /* -ed- main () mauvais interface. */ int main (void) { /* -ed- valeurs indéterminees. */ int i; float val; char s; i = menu (); while (i != 4) { switch (i) { case (1): /* -ed- BUG : passage de deux valeurs indéterminées a la fonction. Le comportement est indéterminé. Tout peut arriver. */ insertion (s, val); break; case (2): extraire (); break; case (3): affichage (); break; default: printf ("\n choix inexistant"); } } /* -ed- main() retourne une valeur au système. 0 = OK */ return 0; }
Mais tu devrais avoir les informations nécessaires à la correction en lisant mes commentaires.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Project : Forums Compiler : GNU GCC Compiler (called directly) Directory : C:\dev\forums\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.c main.c: In function `extraire': main.c:91: warning: control reaches end of non-void function main.c: In function `main': main.c:136: warning: 'val' might be used uninitialized in this function main.c:137: warning: 's' might be used uninitialized in this function Linking console executable: console.exe Process terminated with status 0 (0 minutes, 1 seconds) 0 errors, 3 warnings
Ahem... http://emmanuel-delahaye.developpez....tm#cfg_compilo
J'ai complété mon message...
J'ai été beaucoup moins rapide qu'Emmanuel (pause sandwich oblige), mais voici tout de même mes corrections:
N'hésite pas à poser des questions.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253 #include <stdio.h> #include <stdlib.h> /* -tc- pas portable! #include <conio.h> */ /* -tc- on remplace clrscr(). Ce n'est pas necessaire, mais si on le fait, autant le faire de maniere pseudo-portable avec l'aide du pre-processeur ou en utilisant une bibliotheque telle que PDCurses pour les "mises en page" plus evoluees */ #if defined (WIN32) # define CLR_SCR() system("CLS"); #elif defined (__linux) # define CLR_SCR() system("clear"); #else # error "Not defined for this platform!" #endif struct liste_event { char type; float temps; struct liste_event *next; }; /* -tc- POURQUOI utilises-tu une variable globale ici??? Je l'elimine! struct liste_event *tete; */ /* -tc- purge le tampon du flux d'entree standard de maniere portable */ void purger(void) { int c; while ((c = fgetc(stdin)) != '\n' && c != EOF) { } } void pause(char const *message) { int c; if (message != NULL) { printf("%s ", message); fflush(stdout); } c = getchar(); if (c != '\n' && c != EOF) { purger(); } } /*fonction d'insertion*/ /* -tc la variable globale ayant ete eliminee, on ajoute un parametre tete au prototype de la fonction. La liste peutêtre */ void insertion(struct liste_event **p_tete, char s, float val) { /* -tc- programmation defensive: on s'assure de la validite des parametres */ if (p_tete != NULL) { struct liste_event *pt1; struct liste_event *pt2; struct liste_event *event; pt1 = *p_tete; /* -tc- il est deconseille de convertir le type de la valeur retournee par malloc() */ event = malloc(sizeof *event); /* -tc- il faut TOUJOURS tester si l'allocation a reussi */ if (event != NULL) { event->type = s; event->temps = val; if (pt1 == NULL) { /* insertion au debut */ event->next = pt1; /* -tc- on retourne l'adresse de la tete de la liste */ *p_tete = event; } else { /* -tc- on se place au debut de la liste */ pt2 = pt1; /* -tc- ... et on parcourt toute la liste */ while (pt2 != NULL && pt2->temps < event->temps) { pt1 = pt2; pt2 = pt2->next; } if (pt2 == *p_tete) { /* -tc- event->temps est le plus petit de la liste */ *p_tete = event; event->next = pt2; } else { pt1->next = event; event->next = pt2; } } } } } struct liste_event *extraire(struct liste_event **p_tete) { struct liste_event *event = NULL; /* -tc- test la validite du parametre */ if (p_tete != NULL) { struct liste_event *p; p = *p_tete; if (p == NULL) { printf("liste vide\n"); } else { *p_tete = p->next; event = p; printf("l'evennement retir est: "); /* -tc- on force l'affichage */ fflush(stdout); } } return event; } void affichage(struct liste_event *tete) { /* -tc- pas d'affichage su la liste est vide */ if (tete != NULL) { struct liste_event *courant; courant = tete; while (courant != NULL) { printf(" le type de l'evennement est: %c\n", courant->type); printf(" le temps de l'evennement est: %f\n", courant->temps); courant = courant->next; } } } int menu(void) { int choix = 0; int rv = 0; /* -tc- pas portable! clrscr(); gotoxy(10,2); */ CLR_SCR(); /* -tc- je trouve plus logique de finir chaque ligne par un caractere de fin de ligne, plutot que de commencer chaque ligne avec ce caractere */ printf("**********GESTION DE LA LISTE**********\n"); printf(" 1-introduire un nouvel evenement\n"); printf(" 2-Extraire le premier evenement\n"); printf(" 3-Afficher le contenu de la liste des evenements\n"); printf(" 4-EXIT\n"); do { printf(" Faites votre choix: "); /* -tc- Il est necessaire (pour etre portable) de forcer l'affichage de l'invite ici */ fflush(stdout); rv = scanf("%d", &choix); /* -tc- getch() n'est pas standard et elle n'est clairement pas adaptee pour purger le tampon du flux d'entree standard */ purger(); } while (rv != 1 || choix < 1 || choix > 4); /* -tc- return n'est pas une fonction, les parentheses sont inutiles */ return choix; } /* -tc- main() retorune un entier de type int, toujours! */ int main(void) { /* -tc- remplace la variable globale */ struct liste_event *tete = NULL; float val; char s; int choix; choix = 2; while (choix != 4) { choix = menu(); switch (choix) { case 1: printf(" entrez le type de l'evenement: "); fflush(stdout); scanf("%c",&s); /* -tc- on purge le tampon si necessaire */ if (s != '\n' && s != EOF) { purger(); } printf(" entrez le temps de l'evenement: "); fflush(stdout); scanf("%f", &val); purger(); insertion(&tete, s, val); break; case 2: extraire(&tete); break; case 3: affichage(tete); pause("Appuyez sur ENTER pour revenir au menu..."); break; case 4: /* -tc- 4 est un choix valide qui signifie quitter */ break; default: printf(" choix inexistant\n"); break; } } /* -tc- 0, EXIT_SUCCESS et EXIT_FAILURE sont les 3 valeurs portables que peut retourner main() */ return 0; }
Thierry
Merci beaucoup de m'avoir corrigée :)
je n'ai pas très bien compris ce qui se passe ici :oops::
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void purger(void) { int c; while ((c = fgetc(stdin)) != '\n' && c != EOF) { } } void pause(char const *message) { int c; if (message != NULL) { printf("%s ", message); fflush(stdout); } c = getchar(); if (c != '\n' && c != EOF) { purger(); } }