et quand tu parcours ton fichier c'est toujours la même ligne de ton fichier qui fait planter?
si oui en quoi est elle différentes de celles qui font que ça marche
Version imprimable
et quand tu parcours ton fichier c'est toujours la même ligne de ton fichier qui fait planter?
si oui en quoi est elle différentes de celles qui font que ça marche
augmenter les niveaux de check du compilateur pour qu'il soit plus strict je viens d'essayer de recompiler chez moi il y'a peu etre des warning interessant...
wasa.cpp: In function `int main()':
wasa.cpp:57: error: `AvoirDate' undeclared (first use this function)
wasa.cpp:57: error: (Each undeclared identifier is reported only once for each function it appears in.)
wasa.cpp:59: error: `g_CheminFichierCompteRenduAnalyse' undeclared (first use this function)
wasa.cpp:59: error: `AjouterEntree' undeclared (first use this function)
wasa.cpp:64: error: `g_CheminFichierDecodageFNR1' undeclared (first use this function)
wasa.cpp:65: error: `g_CheminFichierDecodageMPS' undeclared (first use this function)
wasa.cpp:71: warning: int format, long int arg (arg 2)
wasa.cpp:71: warning: int format, long int arg (arg 2)
wasa.cpp:76: warning: int format, long int arg (arg 2)
wasa.cpp:76: warning: int format, long int arg (arg 2)
wasa.cpp:80: error: `Estrtok' undeclared (first use this function)
wasa.cpp:119: warning: int format, long int arg (arg 2)
wasa.cpp:119: warning: int format, long int arg (arg 2)
wasa.cpp:125: error: `g_CheminFichierLog' undeclared (first use this function)
wasa.cpp:262: error: `g_CheminTableauAssociationHLR' undeclared (first use this function)
wasa.cpp:262: error: `Chercher' undeclared (first use this function)
wasa.cpp:263: error: `LireLigne' undeclared (first use this function)
wasa.cpp:281: error: `getpid' undeclared (first use this function)
wasa.cpp:306: warning: int format, long int arg (arg 2)
wasa.cpp:306: warning: int format, long int arg (arg 2)
wasa.cpp:312: warning: int format, long int arg (arg 2)
wasa.cpp:312: warning: int format, long int arg (arg 2)
wasa.cpp:333: warning: int format, long int arg (arg 2)
wasa.cpp:333: warning: int format, long int arg (arg 2)
wasa.cpp:8: warning: unused variable 'fichier'
wasa.cpp:22: warning: unused variable 'valide'
wasa.cpp:31: warning: unused variable 'compteurDiffHLR'
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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE * fichier; FILE * fichierMPS; FILE * fichierFNR; char log[200]; char * donneeFNR; char * donneeMPS; char temp1[150] = ""; char temp2[150] = ""; char * tempEnvironnement; char ** ligneConf; char ** correspondance; int i; int valeurRetour = 0; int valide = 1; int luMPS = 0; int luFNR = 0; double comp; //valeur pour le compte-rendu long compteurFNRUniques = 0; long compteurMPSUniques = 0; long compteurDiffIMSI = 0; long compteurDiffHLR = 0; long compteurDiffRN = 0; ligneConf = (char**)malloc(sizeof(char*)); ligneConf[0] = (char *)malloc(sizeof(char) * 100); correspondance = (char**)malloc(sizeof(char*)); correspondance[0] = (char *)malloc(sizeof(char) * 100); donneeFNR = (char *)malloc(sizeof(char) * 150); donneeMPS = (char *)malloc(sizeof(char) * 150); log[0] = '\0'; ///////////////////////////////// //////////////////////// //////DEBUT DE LA COMPARAISON FNR1 - MPS //////////////////////// ///////////////////////////////// //logger AvoirDate(log); strcat(log, "Debut de la comparaison FNR-MPS..."); AjouterEntree(g_CheminFichierCompteRenduAnalyse, log); //informer utilisateur printf("\nDebut de la comparaison : FNR1 et MPS"); if (((fichierFNR = fopen(g_CheminFichierDecodageFNR1, "r")) != NULL)&& ((fichierMPS = fopen(g_CheminFichierDecodageMPS, "r")) != NULL)) { //debut comparaison printf("\nlol : %d", ftell(fichierFNR)); //lecture de la premiere ligne de chaque fichier if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1; if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1; printf("\nlol : %d", ftell(fichierFNR)); //mettre dans temp1 le MSISDN de MPS strcpy(temp1, donneeMPS); Estrtok(temp1, ';', 0); //assigner a comp la valeur numerique du MSISDN de MPS comp = atof(temp1); //assigner maintenant a temp1 le MSISDN de FNR strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); //tant que la ligne de FNR1 lue ne commence pas par un MSISDN while((strlen(temp1) != 11)&&(luFNR ==0)) { //lire prochaine ligne if((fgets(donneeFNR, 100, fichierFNR)) == NULL)luFNR = 1; //selectionner le MSISDN strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); } //boucle : //tant que les deux fichier n'ont pas ete entierement parcourus while((!luFNR)||(!luMPS)) { //les fichiers sont senses etre tries. trois cas sont alors confrontes. Si MSISDN ligne FNR < MSISDN ligne MPS, //alors c'est que le MSISDN MPS est manquant. l'inverse est teste aussi. //si aucun des deux cas n'est releve, c'est que les deux MSISDN sont egaux, donc que c'est normal. //s'ensuivent alors les traitement normaux //prendre les MSISDN des deux lignes //pour rappel comp vaut la valeur numerique du MSISDN de MPS // et temp1 vaut le MSISDN (string) de FNR //MSISDN unique a FNR if ((comp > atof (temp1))||((luMPS)&&(!luFNR))) { printf("\nlol : %d", ftell(fichierFNR)); //logger en tant que MSISDN unique a FNR1 AvoirDate(log); strcat(log, "MSISDN unique a FNR1 par rapport a MPS : "); strcat(log, donneeFNR); AjouterEntree(g_CheminFichierLog, log); printf("\nlol1"); printf("\nlol2"); //lire nouvelle ligne FNR1 if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1; printf("\ncoucou1\n"); //associer a temp1 le MSISDN de MPS strcpy(temp1, donneeMPS); //assigner a comp la valeur numerique du MSISDN de MPS Estrtok(temp1, ';', 0); comp = atof(temp1); //associer a temp1 le nouveau MSISDN de FNR strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); //incrementer le compteur compteurFNRUniques++; //tant que la ligne de FNR1 lue ne commence pas par un MSISDN while((strlen(temp1) != 11)&&(luFNR ==0)) { //lire prochaine ligne if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1; //selectionner le MSISDN strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); } } //MSISDN unique a MPS else if ((comp < atof(temp1))||((luFNR)&&(!luMPS))) { printf("\ncoucou2\n"); //logger en tant que MSISDN unique a MPS AvoirDate(log); strcat(log, "MSISDN unique a MPS par rapport a FNR1 : "); strcat(log, donneeFNR); AjouterEntree(g_CheminFichierLog, log); //incrementer le compteur compteurMPSUniques++; donneeMPS[0] = '\0'; //lire nouvelle ligne MPS if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1; //associer a temp1 le nouveau MSISDN de MPS strcpy(temp1, donneeMPS); Estrtok(temp1, ';', 0); //assigner a comp la valeur numerique du MSISDN de MPS comp = atof(temp1); //associer a temp1 le MSISDN de FNR strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); } //les deux MSISDN sont communs else { printf("\ncoucou3\n"); //verifier la concordance des donnees associees //examiner le deuxieme champ de ligne FNR pour deteriner la nature des donnees a comparer strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 1); //si c'est un couple MSISDN-RN chez FNR if (strlen(temp1) < 5) { //regarder le quatrieme champ dans MPS strcpy(temp2, donneeMPS); Estrtok(temp2, ';', 3); //si les deux champs sont egaux en rien faire, //si les deux champs sont differents logger if((strcmp(temp1, temp2)) != 0) { //prelever le MSISDN strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); //logger AvoirDate(log); strcat(log, "difference de RN pour le MSISDN"); strcat(log, temp1); strcat(log, "entre FNR1 et MPS"); AjouterEntree(g_CheminFichierLog, log); //incrmenter le compteur compteurDiffRN++; } } //si c'est un trio MSISDN-IMSI-HLR chez FNR else { //regarder le deuxieme champ dans MPS (IMSI) strcpy(temp2, donneeMPS); Estrtok(temp2, ';', 1); //si les deux champs sont egaux verifier le HLR //sinon logger if((strcmp(temp1, temp2)) != 0) { //prelever le MSISDN strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); //logger AvoirDate(log); strcat(log, "difference d'IMSI pour le MSISDN"); strcat(log, temp1); strcat(log, "entre FNR1 et MPS"); AjouterEntree(g_CheminFichierLog, log); //incrementer le compteur compteurDiffIMSI++; } else { //examiner maintenant les HLR des deux entrees strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 2); strcpy(temp2, donneeMPS); Estrtok(temp2, ';', 2); //verifier les HLR a l'aide des tables i = Chercher(g_CheminTableauAssociationHLR, temp1); if (i > 0)correspondance = LireLigne (g_CheminTableauAssociationHLR, i, i); else { printf("\nLe numero de HLR %s, sense se trouver dans le fichier %s, n'a pas ete trouve. La commande MML ne sera pas ecrite.", g_CheminTableauAssociationHLR, temp1); //log AvoirDate(log); tempEnvironnement = getenv("PS1"); Estrtok(tempEnvironnement, '@', 1); Estrtok(tempEnvironnement, ':', 0); if(tempEnvironnement != NULL){strcat(log, tempEnvironnement);strcat(log, ";");} else strcat(log, ";"); strcat(log, "audit;"); sprintf(log, "%s%d;", log, getpid()); tempEnvironnement = getenv("USER"); if(tempEnvironnement != NULL)strcat(log, tempEnvironnement); else strcat(log, ";"); strcat(log, ";NOTICE;comparer.c;AUD;031;Le numero de HLR"); strcat(log, temp1); strcat(log, "n'a pas ete trouve dans le fichier d'association. La commande MML de creation ne sera pas ecrite;;"); AjouterEntree(g_CheminFichierLog, log); } Estrtok(correspondance[0], 164, 0); //assigner a temp1 la valeur du HLR de FNR strcpy(temp1, correspondance[0]); printf("\ntemp1 : %s", temp1); } } donneeMPS[0] = '\0'; donneeFNR[0] = '\0'; printf("\nlol : %d", ftell(fichierFNR)); //lire nouvelle ligne MPS if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1; //lire nouvelle ligne FNR1 if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1; printf("\nlol : %d", ftell(fichierFNR)); //associer a temp1 le nouveau MSISDN de MPS strcpy(temp1, donneeMPS); Estrtok(temp1, ';', 0); //assigner a comp la valeur numerique du MSISDN de MPS comp = atof(temp1); //associer a temp1 le nouveau MSISDN de FNR strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); //tant que la ligne de FNR1 lue ne commence pas par un MSISDN while((strlen(temp1) != 11)&&(luFNR ==0)) { //lire prochaine ligne if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1; //selectionner le MSISDN strcpy(temp1, donneeFNR); Estrtok(temp1, ';', 0); } printf("\nlol : %d", ftell(fichierFNR)); } } fclose(fichierFNR); fclose(fichierMPS); } else { //mettre la valeur de retour a 1 pour VTOm valeurRetour = 1; //informer utilisateur printf("\nErreur d'ouverture des fichiers de FNR1 ou MPS decodes."); //logger AvoirDate(log); strcat(log, "Erreur d'ouverture des fichiers de FNR1 ou MPS decodes. Fin de la comparaison"); AjouterEntree(g_CheminFichierCompteRenduAnalyse, log); } return valeurRetour; }
Je ne sais pas d'où vient l'erreur, et sans tout les éléments (fichier d'exemple, code des fonctions appelées) il est difficile de chercher pour toi.
Ceci étant quelques remarques qui peuvent t'aider à trouver le problème et à avoir un code plus robuste :
- Ne fais pas des fonctions de 300 ou 400 lignes qui font plusieurs choses, découpe ton code en fonctions élémentaires et testes les séparément. Un code aussi long et peu modulaire que celui que tu as est une horreur à lire et à corriger.
- Testes les valeurs de retour des différentes fonctions. Par exemple ici tu utilises joyeusement de la mémoire que tu as allouée sans vérifier si malloc() n'avait pas retourné une erreur.
- Rends les ressources que tu as prises. Ici tu ne libères pas la mémoire allouée et dans certains cas le fichier fichierFNR n'est pas fermé.
- Tu ne testes jamais ce que tu viens de lire (et si fgets() ne lit pas toutes une ligne ? Si il n'y a pas de ; dans les données lues ?). En cas d'erreur de format dans le fichier, il y a une probabilité non nulle que le programme plante.
[EDIT] Une autre petite remarque, ce n'est pas parce que tu as des traces de debug avant une ligne et pas celle après que le problème est forcément sur cette ligne. Le bug apparait ici (et encore avec les bufferisation de stdout, ce n'est même pas certain, il faudrait sortir les traces sur stderr) mais la cause peut se situer bien avant.
[Edit bis] Autre problème qui peut potentiellement être la source de l'erreur. En cas d'erreur de lecture (fgets() retourne NULL), tu positionnes bien un flag pour indiquer l'erreur et éventuellement arrêter la boucle de lecture plus tard, mais tu utilise tout de même le buffer de lecture qui ne contient certainement pas des données valides.
ouille.Citation:
* Ne fais pas des fonctions de 300 ou 400 lignes qui font plusieurs choses, découpe ton code en fonctions élémentaires et testes les séparément. Un code aussi long et peu modulaire que celui que tu as est une horreur à lire et à corriger.
je ne vais pas te parler de ma méga fonction de fin qui fait 9000 lignes...:ccool:
cela sera faitCitation:
* Testes les valeurs de retour des différentes fonctions. Par exemple ici tu utilises joyeusement de la mémoire que tu as allouée sans vérifier si malloc() n'avait pas retourné une erreur.
je m'excuse mais le fichier FNR est fermé à la fin du programme. et en effet je ne fais pas de free pour les string mais cela sera fait aussiCitation:
* Rends les ressources que tu as prises. Ici tu ne libères pas la mémoire allouée et dans certains cas le fichier fichierFNR n'est pas fermé.
je ne teste pas ce que je viens de lire car le fichier que je lis est généré par un autre sous programme que j'ai codé, qui lui-même test les données et écarte les données vérolées. donc les lignes ne dépasseront jamais 100 caractères, les points virgules seront présents, vu que le fichier est élaboré par mes soins.Citation:
* Tu ne testes jamais ce que tu viens de lire (et si fgets() ne lit pas toutes une ligne ? Si il n'y a pas de ; dans les données lues ?). En cas d'erreur de format dans le fichier, il y a une probabilité non nulle que le programme plante.
je vais donc de ce pas corriger l'oubli de libération de mémoire et de teste d'allocation, mais, sans vouloir mettre en doute, je doute fort que ça soit ça qui fasse planter...
clair que c'est pas simple.
vu le contexte il doit y avoir pas mal de pression aussi ;). et ça n'aide pas pour faire les choses calmenent et proprement en général.
certes.
d'autant plus que la sécurité vient d'éteindre les lumières, signe que je dois arrêter sous peine de me faire virer à coup de pompe dans le c.
donc, clef USB, et codage ce week-end. youpi.
au moins je pourrai coder sur mon pc perso, avec un vrai IDE et des zoulies fenêtre toutes bleues et surtout...un...? un...? un débuggeur!!!!
merci en tout cas de votre soutien, et priez pour ma tête lundi. car elle ne sera pas attachée à grand chose. (et je l'aurai bien mérité)
bon week - end à tous!!
Non.
Si l'ouverture de fichierFNR est OK mais qu'il y a une erreur lors de l'ouverture de fichierMPS, tu passe dans le else et le fichier fichierFNR n'est pas fermé.
Sinon j'ai édité mon message pendant que tu répondais. Tu devrais regarder la remarque sur le test des erreurs de lecture.
désolé pour les béotiens...
si tu es sur le projet que je pense du coté de Nantes tu comprendra.
J'ai discuté hier avec la personne qui a codé la premiere version de l'ACT FNR sous kis (en 2005), il m'a confié que la gestion des rollbacks pouvait conduire a des incohérences dans certains cas.
maintenant si vous êtes passé a kpsa le code à du prendre de grosses claques et cette remarque n'est peu être plus d'actualités.
si tu croise ceux de vélizy qui était la à l'époque passe leur le bonjour de fred de lyon :D
hey fred. alors pour te raconter un peu ma vie je bosse à Vélizy (MOE provisioning) et je viens d'apprendre que le projet vient de monter de deux crans pour cause de...? je ne sais pas, je te tiendrai au courant. merci en tout cas de ton soutien, merci à tous d'ailleurs.
En tout cas il n'y a pas de rollback puisque pas de modification SQL (que du select).
gl :c'est en effet un oubli de ma part pour le test d'ouverture, je vais corriger ça, merci
tu as tout à fait raison. je vais arrêter de me focaliser sur cette ligne et essayer d'être plus rigoureux.Citation:
[EDIT] Une autre petite remarque, ce n'est pas parce que tu as des traces de debug avant une ligne et pas celle après que le problème est forcément sur cette ligne. Le bug apparait ici (et encore avec les bufferisation de stdout, ce n'est même pas certain, il faudrait sortir les traces sur stderr) mais la cause peut se situer bien avant.
c'est probablement ça. Je corrige, je teste et je vous tiens au courant.Citation:
[Edit bis] Autre problème qui peut potentiellement être la source de l'erreur. En cas d'erreur de lecture (fgets() retourne NULL), tu positionnes bien un flag pour indiquer l'erreur et éventuellement arrêter la boucle de lecture plus tard, mais tu utilise tout de même le buffer de lecture qui ne contient certainement pas des données valides.
De mémoire l'été etais toujours tendu sur ce projet pour cause de mise en prod pour septembre/octobre pour que le système soient près a passer noel....
allé courage :D
merci. bon. Ca plante toujours. Je ne sais plus quoi faire.
j'ai absolument tout testé, toutes les remarques de gl ont été intégrées à mon code. Je suis tout simplement bloqué. je vais chercher encore, notamment en changeant les fichiers lus. Si quelqu'un a une idée, n'hésitez pas.
Est cce que c'est toujours la même donnée qui fait planter ou pas?
non. le fait de lire un fichier fait planter. si l'on remplace fichierFNR par fichierMPS ça donne la même. et si fgets fait arriver la données dans un autre string ça plante aussi. par contre si on lit la donnée dans un nouveau fichier, ça marche sans problème.
j'ai testé ferror(fichier FNR) et çe ne renvoie rien de concluant. feof fait planter.
je suis un peu sec sans données pour tester,
peu etre que le fichier d'entrée est verollé....
Es-tu sûr que le tableau log est suffisamment grand (200), parce que parfois tu écris vraiment beaucoup de choses dans ce buffer.(je suppose que le code AjouterEntree(g_CheminFichierLog, log) remet bien ce buffer à 0)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 ... AvoirDate(log); tempEnvironnement = getenv("PS1"); Estrtok(tempEnvironnement, '@', 1); Estrtok(tempEnvironnement, ':', 0); if(tempEnvironnement != NULL){strcat(log, tempEnvironnement);strcat(log, ";");} else strcat(log, ";"); strcat(log, "audit;"); sprintf(log, "%s%d;", log, getpid()); tempEnvironnement = getenv("USER"); if(tempEnvironnement != NULL)strcat(log, tempEnvironnement); else strcat(log, ";"); strcat(log, ";NOTICE;comparer.c;AUD;031;Le numero de HLR"); strcat(log, temp1); strcat(log, "n'a pas ete trouve dans le fichier d'association. La commande MML de creation ne sera pas ecrite;;");
j'ai testé en doublant la taille du buffer, rien.
Et en effet la fonction ajouterEntree remet la chaîne à 0.
et tu n'a pas de fonctions type strtok qui te déplace tes pointeurs?
voici le contenu de ma fonction Estrtok, qui remplit un rôle similaire à strtok, et dont je me sers tout le temps, mais qui ne m'a jamais fait planter :
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 #include "biblio.h" void Estrtok(char * chaine, char delim, int num) { int i; int numerolu; char resultat[50]; i = 0; numerolu = 0; resultat[0] = '\0'; while ((i != num)&&(chaine[numerolu] != '\0')) { if (chaine[numerolu] == delim)i++; numerolu++; } i = 0; while ((chaine[numerolu] != delim)&&(chaine[numerolu] != '\0')&&(chaine[numerolu] != '\n')) { resultat[i] = chaine[numerolu]; numerolu++; i++; } resultat[i] = '\0'; strcpy(chaine, resultat); }
resultat ne fait que 50 en taille, il me semble que les chaines que tu manipule dans ton programme principale sont plus grande non (150)?
ne vas tu pas trop loin dans resultat, dans ce cas ça fait un coredump.....
haaa yes c'est exactement ça!!! jamais j'aurai pu m'en douter. merci beaucoup! tu me retires une épine du pied. vraiment merci :merci: