Alors ton code doit être du C++. Ce n'est pas le cas.Envoyé par isoman
De plus, ce n'est pas le bon forum...
Si ton prof veut que tu écrives en C et que tu compiles en C++, change de prof de toute urgence. C'est un agent de l'ennemi...
Alors ton code doit être du C++. Ce n'est pas le cas.Envoyé par isoman
De plus, ce n'est pas le bon forum...
Si ton prof veut que tu écrives en C et que tu compiles en C++, change de prof de toute urgence. C'est un agent de l'ennemi...
Le probleme c'est qu'on utilise visual 6 a l'ecole et lrsq on cree un nouveau projet le fichier est automatiquement un *.cpp et il faut qu'on le renomme en .c .Je lui ait fait la remarque mais il est un peu "borné" .Alors ton code doit être du C++. Ce n'est pas le cas.
De plus, ce n'est pas le bon forum...
Si ton prof veut que tu écrives en C et que tu compiles en C++, change de prof de toute urgence. C'est un agent de l'ennemi...
sinon est que tu a une ptite idée de la cause du probleme ?
Je ne sais pas. Tu as du code compilable en C à proposer ? Tu as déjà corrigé tout ce que mon compilateur a signalé ?Envoyé par isoman
voila le code corrigé en C .
code corrigé en c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <assert.h> #define vrai 1 #define faux 0 #define chemin_fichier_section "D:\\fichier_section.txt" #define chemin_fichier_procede "D:\\fichier_procede.txt" #define chemin_fichier_article "D:\\fichier_article.txt" #define chemin_fichier_machine "D:\\fichier_machine.txt" typedef struct information_composant //c pour l'arbre des procedures { int code_composant; float qte; int code_section_usinage; int temps_integration_composant ; }information_composant; typedef struct liste_composant //ça aussi { information_composant info_composant; struct liste_composant* svt; }liste_composant; typedef struct noeud_compose // noeud de l'arbre des procedures { int code_compose; liste_composant* les_composants; struct noeud_compose* fg; struct noeud_compose* fd; }noeud_compose; typedef noeud_compose* procede; // fct qui ajoute la struct composant dans la liste chainée void ajouter_fin_liste_composant(liste_composant** l_c,information_composant c) { liste_composant* temp=*l_c; if (temp==NULL) { (*l_c)=(liste_composant*)malloc(sizeof(liste_composant*)); (*l_c)->info_composant=c; (*l_c)->svt=NULL; } else { while(temp->svt!=NULL) {temp=temp->svt;} temp->svt=(liste_composant*)malloc(sizeof(liste_composant*)); temp->svt->info_composant=c; temp->svt->svt=NULL; } } //fct qui chagre le contenu du fichier noeud_compose* charger_fichier_procede(FILE* fichier_procede) { noeud_compose* procede=NULL; int x,code_compose,entre=vrai; liste_composant *l_c=NULL; information_composant composant; char test[5],valeur[35]; assert(fichier_procede!=NULL); do//tant que x=!EOF le scan du fichier continue { x=fscanf(fichier_procede,"%s %s",&test,&valeur); // le probleme se //situe ici lorsque le prog passe de cette instruction au if //composant.code_composant change de valeur et prend 0 !!! if (strcmp(test,"code")==0 && strcmp(valeur,"compose")==0) { x=fscanf(fichier_procede,"%s",&valeur); code_compose=atoi(valeur);// conversion en valeur //numerique } else { do // lecture des caracteristiques des composant tant qu'on //n'a pas atteint la fin du fichier { entre=faux; if (strcmp(test,"code")==0 && strcmp(valeur,"composant")==0) { x=fscanf(fichier_procede,"%s",&valeur); composant.code_composant=atoi(valeur); entre=vrai; strcpy(test," ");// re-initialisation de test && valeur strcpy(valeur," "); } if (strcmp(test,"quantite")==0) { composant.qte=(float)atof(valeur); entre=vrai; strcpy(test," "); strcpy(valeur," "); } if (strcmp(test,"code")==0 && strcmp(valeur,"section")==0) { x=fscanf(fichier_procede,"%s %s %s",&valeur,&valeur,&valeur); composant.code_section_usinage=atoi(valeur); entre=vrai; strcpy(test," "); strcpy(valeur," "); } if ( strcmp(test,"temps")==0) { x=fscanf(fichier_procede,"%s%s",&valeur,&valeur); composant.temps_integration_composant=atoi(valeur); entre=vrai; ajouter_fin_liste_composant(&l_c,composant); // ajout des caracteristiques // dans la liste strcpy(test," "); strcpy(valeur," "); } } while (entre==vrai); } } while(x!=EOF); return (procede);// ici procede==NULL prcq je n'ai pas encore ecrit la //fct qui ajoute la liste dans l'arbre des procedes . }
Gné ?Envoyé par isoman
Et il n'y a pas de main()...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Compiling: main.c main.c: In function `charger_fichier_procede': main.c:76: warning: char format, different type arg (arg 3) main.c:76: warning: char format, different type arg (arg 4) main.c:81: warning: char format, different type arg (arg 3) main.c:97: warning: char format, different type arg (arg 3) main.c:117: warning: char format, different type arg (arg 3) main.c:117: warning: char format, different type arg (arg 4) main.c:117: warning: char format, different type arg (arg 5) main.c:128: warning: char format, different type arg (arg 3) main.c:128: warning: char format, different type arg (arg 4) 9 warnings
Je n'ai jamais compris pourquoi ce genre de code (ajouter_fin_liste_composant() ) était aussi compliqué. Ceci suffit, non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 // fct qui ajoute la struct composant dans la liste chainée void ajouter_fin_liste_composant (liste_composant ** l_c, information_composant c) { liste_composant *temp = malloc (sizeof *temp); if (temp != NULL) { temp->info_composant = c; temp->svt = NULL; if (*l_c == NULL) { (*l_c) = temp; } else { liste_composant *p = *l_c; while (p->svt != NULL) { p = p->svt; } p->svt = temp; } } }
yep ta fonction est plus élegantemais mon compilo ne m'affiche pas de warnings (sauf le main() );
On a déjà indiqué comment configurer correctement le compilateur...Envoyé par isoman
http://emmanuel-delahaye.developpez....tm#cfg_compilo
et on fait comment pour le compilo de visual 6 ?
Dans les preferences du projet (je ne me souviens plus exactement ou), il y a une variable nommee "niveau d'avertissement", par defaut elle est a 3 (le maximum etant 4).Envoyé par isoman
merci
comme je l'ai dit un peu plus haut je la valeur de composant.code_composant prends 0 juste aprés leje me suis dit que c'est peut etre fscanf qui buggue donc j'ai regradé dans l'index et voila ce que j'ai trouvé
Code : Sélectionner tout - Visualiser dans une fenêtre à part x=fscanf(fichier_procede,"%s %s",test,valeur);
. Est ce que qlqn peut m'expliquer ce que veut dire overlap et pensez vous que fscanf est la cause du bug ,est ce qu'il y a une fct qui peut la remplacer facilement car j'avoue que si je vais la remplacer par des fgets ça va eter vraiment tres embêtant?The fscanf function reads data from the current position of stream into the locations given by argument (if any). Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. format controls the interpretation of the input fields and has the same form and function as the format argument for scanf; see scanf for a description of format. If copying takes place between strings that overlap, the behavior is undefined.
merci
Ca dépend comment sont définis test et valeur...Envoyé par isoman
overlap, c'est quand deux pointeurs pointent sur la même zone mémoire.
Par exemple, ceci provoque un comportement indéterminé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char s[20]; fscanf (file, "%s%s", s, s + 10);
Ca déclenche des warnings intéressants commeEnvoyé par gl
Warning : "double affectation" (de mémoire, je n'ai pas touché à VC6 depuis 10 ans)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 char *s = malloc(123); s = "hello";
Mais pas l'analyse des chaines passées à *printf() et *scanf()...
Mais rien n'empêche de vérifier son code avec gcc et de le compiler avec VC6... J'ai fait ça professionnellement pendant des années. gcc en mode parano etait mon 'vérificateur de code' et ensuite le compilais avec un compilateur C plus ou moins rustique pour la cible en question.
Evidemment, il faut écrire du code le plus portable possible, sinon, les compilateurs s'affolent...
Possibe, j'avoue ne plus me souvenir des controles ajoutes lors du passage en niveau 4.Envoyé par Emmanuel Delahaye
Il est effectivement fort possible que le controle des chaines passees a *printf() et *scanf() n'en fasse pas partie, d'une maniere generale, j'ai vu peu de compilateurs faire un controle correct des parametres de 9printf() et *scanf().
D'une maniere generale, il est assez interessant, quand c'est possible, de compiler un meme code avec differents compilateurs (et differents reglages des compilateurs), ca permet d'assainir considerablement le code (l'ideal restant tout de meme le passage a un outil d'analyse de code du type de PClint)Envoyé par Emmanuel Delahaye
Overlap en anglais signifie "recouvrement"...Envoyé par isoman
Donc, comme pour des tuiles... Là ça veut dire que ,comme l'a dit Emmanuel, 2 chaînes partagent un même endroit mémoire. Ce qu'ils disent c'est
"si 2 chaînes ont été définies comme partageant un certain espace mémoire, le fait de faire un fscanf dans une des deux donne un résultat indéfini".
ok je vais re-ecrire la fct qui buggue par quelles fonctions est ce que je peux remplacer le fscanf ?
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
j'ai enfin trouvé la source du probleme , il fallait juste augmenter la taille du tableau test!!!!!!!!!!
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Partager