Mais où est passée ma variable? [Resolu]

Mais où est passée ma variable? [Resolu] - C - Programmation

Marsh Posté le 29-04-2008 à 16:32:21    

Bonjour à tous et à toutes,
 
J'ai une structure contenant des informations :  

Code :
  1. typedef struct {
  2.    float t_pts_gauche[MAXPTS][2];
  3.    float t_pts_droite[MAXPTS][2];
  4.    int i_nb_pts_droite;
  5.    int i_nb_pts_gauche;
  6. }structure_s;


 
dans une fonction je parcours un fichier texte pour chopper une variable se trouvant 117 caractères plus loin que le début du fichier et je sauve la valeur dans la structure :
 

Code :
  1. // On se place sur la ligne contenant le nombre de points presents pour la camera gauche
  2. fseek(fic, 177, SEEK_SET);
  3. fscanf(fic,"         %i",&my_struct->i_nb_pts_gauche);


 
j'avance dans le fichier pour aller récuperer des tableaux de points :

Code :
  1. // On se place sur la premiere coordonnee de la grille gauche
  2. fseek(fic, 282, SEEK_SET);
  3. printf("Nbre pts : %d \n", my_struct->i_nb_pts_gauche);


 
et je parcours le fichier en sauvegardant les coordonnées des points :

Code :
  1. // Lecture et stockage des coordonnees de la grille gauche
  2. for(i = 0; i < my_struct->i_nb_pts_gauche; i++)
  3. {
  4.  printf("i : %d, nbpts : %d\n", i,my_struct->i_nb_pts_gauche );
  5.  fscanf(fic,"     %f     %f      %f      %f      %f",
  6.   &poubelle1,
  7.   &poubelle2,
  8.   &poubelle3,
  9.   &my_struct->t_pts_gauche[0],
  10.   &my_struct->t_pts_gauche[i][1]);
  11. }


 
 
Ce que je ne comprends pas est :
 
Si j'affiche ma variable avant la boucle :

Code :
  1. printf("Nbre pts : %d \n", my_struct->i_nb_pts_gauche);


elle contient la valeur 317 (normal)
Sauf que si j'utilise cette même variable pour servir de borne à la fonction for, je n'ai plus du tout 317 mais 1144542659. On dirait une adresse, ce qui est vraiment étrange est que je ne modifie pas la variable [i]my_struct->i_nb_pts_gauche pourtant elle se trouve modifée.
 
Merci beaucoup de votre lanterne.
 
Ju.

Code :
  1. Le code contigu :
  2. void get_points(char *fichier, structure_s *my_struct)
  3. {
  4.    int i;
  5.    int j;
  6.    int k;
  7.    int i_nb_pts_gauche;
  8.    int i_nb_pts_droite;
  9.    float poubelle1;
  10.    float poubelle2;
  11.    float poubelle3;
  12.    i_nb_pts_gauche = 0;
  13.    i_nb_pts_droite = 0;
  14.    i = 0;
  15.    FILE *fic = fopen(fichier, "rt" );
  16.    if (fic)
  17.    {
  18. // On se place sur la ligne contenant le nombre de points presents pour la camera gauche
  19. fseek(fic, 177, SEEK_SET);
  20. fscanf(fic,"         %i",&my_struct->i_nb_pts_gauche);
  21. //my_struct->i_nb_pts_gauche = i_nb_pts_gauche;
  22. // On se place sur la premiere coordonnee de la grille gauche
  23. fseek(fic, 282, SEEK_SET);
  24. printf("Nbre pts : %d \n", my_struct->i_nb_pts_gauche);
  25. // Lecture et stockage des coordonnees de la grille gauche
  26. for(i = 0; i < my_struct->i_nb_pts_gauche; i++)
  27. {
  28.  printf("i : %d, nbpts : %d\n", i,my_struct->i_nb_pts_gauche );
  29.  fscanf(fic,"     %f     %f      %f      %f      %f",
  30.   &poubelle1,
  31.   &poubelle2,
  32.   &poubelle3,
  33.   &my_struct->t_pts_gauche[i][0],
  34.   &my_struct->t_pts_gauche[i][1]);
  35. }


Message édité par jijiz le 30-04-2008 à 09:33:16
Reply

Marsh Posté le 29-04-2008 à 16:32:21   

Reply

Marsh Posté le 29-04-2008 à 16:42:50    

Je n'ai pas vraiment de solution mais :

  • le mode "rt" n'est pas standard, utilise "r".
  • Tu ne peux utiliser fseek() comme ça en mode texte, a priori tu es obligé à parcourir le fichier jusqu'à ce que tu rencontres ta valeur (ou passer par le mode binaire).
  • Personnellement j'évite les *scanf() mais je suis peut-être parano.


---------------
dap.developpez.com
Reply

Marsh Posté le 29-04-2008 à 16:44:58    

dap++ a écrit :

Je n'ai pas vraiment de solution mais :

  • le mode "rt" n'est pas standard, utilise "r".
  • Tu ne peux utiliser fseek() comme ça en mode texte, a priori tu es obligé à parcourir le fichier jusqu'à ce que tu rencontres ta valeur (ou passer par le mode binaire).
  • Personnellement j'évite les *scanf() mais je suis peut-être parano.

Ok pour les remarques, merci.
 
Par contre je ne vois pas directement le lien avec ma variable qui se prends pour copperfield.  
 
ps : je ne peux pas parcourir le fichier jusqu'a ce que je rencontre la valeur car aucun ID ne se trouve devant la valeur, je sais juste qu'elle est a 177 caractères après le début.
pss : j'ai rajouter un getchar() pour faire des pauses et voir toutes mes variables, et voila ce qui se passe :
 

i : 198, nbpts : 319
 
i : 199, nbpts : 319
 
i : 200, nbpts : 319
 
i : 201, nbpts : 1144542659
 
i : 202, nbpts : 1144542659
 
i : 203, nbpts : 1144542659


 
Bon je vous met l'initialisation de ma structure, on sait jamais :
 

structure_s *my_struct;
 my_struct = malloc(sizeof(structure_s));
 
 get_points("/home/julien/7.pts", my_struct);


 
 
Est-ce que c'est possible d'avoir fait un mauvais ou ommis un malloc, ainsi la place mémoire de la variable my_struct->i_nb_pts_gauche serait écransée....?
Perdu.com


Message édité par jijiz le 29-04-2008 à 16:53:01
Reply

Marsh Posté le 29-04-2008 à 16:58:07    

Bon, c'est sur c'est ce code :
 

 fscanf(fic,"     %f     %f      %f      %f      %f",  
   &poubelle1,
   &poubelle2,
   &poubelle3,
   &my_struct->t_pts_gauche[i][0],  
   &my_struct->t_pts_gauche[i][1]);


 
qui modifie ma variable, je ne comprends pas pourquoi ni comment, mais lorsque je le retire, la variable conserve sa valeur..
 
Par quoi remplacer ce scanf et le fseek??


Message édité par jijiz le 29-04-2008 à 16:59:53
Reply

Marsh Posté le 29-04-2008 à 17:01:36    

utilise le débugger pour voir ?


---------------
Töp of the plöp
Reply

Marsh Posté le 29-04-2008 à 17:17:15    

100% de chance pour que tu as dans ton code un truc du genre :
 
#define MAXPTS     200
 
Je te laisse bucher pour savoir ce qui merde ensuite. (Hint: buffer overflow).

Reply

Marsh Posté le 30-04-2008 à 09:11:34    

tpierron a écrit :

100% de chance pour que tu as dans ton code un truc du genre :
 
#define MAXPTS     200
 
Je te laisse bucher pour savoir ce qui merde ensuite. (Hint: buffer overflow).


 
 
Hmmmm, ok merci vais demander à google s'il en sait un peut plus sur le buffer overflow. JE M EN VEUX. :o)
J'espere que je vais devenir bon un jour en prog (il faudrait assez vite) ^


Message édité par jijiz le 30-04-2008 à 09:20:44
Reply

Marsh Posté le 30-04-2008 à 09:23:25    

Encore merci tpierron et à tout le monde.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed