mon programme qui lit dans un fichier .ase ne se termine jamais !

mon programme qui lit dans un fichier .ase ne se termine jamais ! - C++ - Programmation

Marsh Posté le 26-01-2003 à 14:41:40    

il semblerait que mon programme fait une boucle infinie.
la variable "nb_indices[b]"qui est vers la fin de la fonction "lecture"  s'affiche mais pas les "hello"
je n'ai pas d'erreurs, le programme s'exécute mais ne sort jamais de la fonction.
pouvez vous m'aider ?
voici le code :

Code :
  1. #include <stdio.h>
  2. #include <iostream.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <stdlib.h>
  6. //#include <GL/glut.h>
  7. #define nb_vertices 20000
  8. #define nb_faces 20000
  9. struct donnees
  10. {
  11.  float tab_vertices [nb_vertices][3] ;
  12.  int tab_sommets [nb_faces][3] ;
  13. };
  14.     donnees tab_struct[50] ;
  15. int nb_indices[100] ;
  16. int i=0 ;
  17. int j=0 ;
  18. int k=0 ;
  19. int n=0 ;
  20. int m=0 ;
  21. int l, b ;
  22. int a=0 ;
  23.     void lecture ()
  24.     {
  25.  char tmp [100] ;
  26.  char tmp2 [100] ;
  27. char tmp3 [100] ;
  28.  int temp [nb_vertices] ;
  29.  char passe_ligne [200] ;
  30.  char nom_fichier[] = "bob.ase" ;
  31.  FILE *pointeur ;    //pointeur sur le fichier  
  32.  if ((pointeur = fopen(nom_fichier, "r" )) == NULL)
  33.           return ;
  34. do
  35.  {
  36.   fscanf(pointeur, "%s", tmp) ;
  37.  if(strcmp ("*MESH_VERTEX", tmp) == 0)
  38.  {
  39.   a++ ;
  40.  }
  41.  }
  42.  while (!feof(pointeur)) ;
  43. fseek (pointeur, 0,SEEK_SET) ;
  44.  for (b=1;b<=a;b++)
  45. {
  46.  do
  47.   {
  48.    fscanf(pointeur, "%s", tmp) ;
  49.   }
  50.   while (strcmp ("*MESH_VERTEX", tmp) != 0) ; //passe toutes les chaines en revue jusqu'a qu'a ce que tmp soit égal à chaine ("*MESH_VERTEX" )
  51.   do//rempli le tableau de structure avec des coordonnées de vertices
  52.   {
  53.    fscanf (pointeur, "%d%f%f%f%s", &(temp[0]) ,&(tab_struct[b].tab_vertices[i][0]),
  54.    &(tab_struct[b].tab_vertices[i][1]),&(tab_struct[b].tab_vertices[i][2]), tmp) ;
  55.    cout << tab_struct[b].tab_vertices[i][0]<<" "<<tab_struct[b].tab_vertices[i][1]<<" "<< tab_struct[b].tab_vertices[i][2]<<endl ;
  56.   i++ ;
  57.   }
  58.        while (strcmp (tmp, "}" )!=0) ;
  59.   do
  60.   {
  61.   fscanf(pointeur, "%s", tmp2) ;
  62.   }
  63.   while (strcmp ("A:", tmp2) != 0) ;
  64.  do //rempli le tableau de la structure avec le numero des sommets
  65.  {
  66.   fscanf (pointeur, "%d%s%d%s%d", &(tab_struct[b].tab_sommets[j][0]),tmp,
  67.     &(tab_struct[b].tab_sommets[j][1]),tmp, &(tab_struct[b].tab_sommets[j][2])) ;
  68.   //cout << tab_struct[b].tab_sommets[j][0]<<" "<<tab_struct[b].tab_sommets[j][1]<<" "<<tab_struct[b].tab_sommets[j][2]<< endl ;
  69.   fgets (passe_ligne, 200, pointeur) ; //saute une ligne dans le fichier où les données ne servent pas
  70.   fscanf (pointeur, "%s%s%s", tmp3, tmp, tmp);
  71.   j=j+1 ;
  72.   l=l+1 ;
  73.  }
  74.  while (strcmp(tmp3, "}" )!=0) ;
  75.  nb_indices[b] = l*3;
  76.  cout << nb_indices[b]<<endl ;
  77.  l=0 ;
  78.     }
  79.     cout<< "hello1"<<endl ;
  80.      fclose (pointeur) ;
  81.     }
  82.    
  83.  
  84. void main ()
  85. {
  86. lecture () ;
  87. cout<< "hello2"<<endl ;
  88. }


Message édité par airseb le 26-01-2003 à 14:42:15
Reply

Marsh Posté le 26-01-2003 à 14:41:40   

Reply

Marsh Posté le 26-01-2003 à 15:39:14    

:hello:

Reply

Marsh Posté le 26-01-2003 à 15:47:25    

:ouch: désolé, je sors tout de suite

Reply

Marsh Posté le 26-01-2003 à 15:49:43    

++Taz a écrit :

:ouch: désolé, je sors tout de suite


 
il va faire une attaque cardique le petit père taz  [:tinostar]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 26-01-2003 à 15:57:59    

pourquoi fais tu une première passe pour compter les sections *MESHVERTEX ?
 
a priori ca sert à rien :heink:  
 
Et puis sinon des noms de variables explicites ca serait déjà une bonne idée pour du code lisible; par ce que a, b, i ... :o


Message édité par schnapsmann le 26-01-2003 à 15:58:24

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 26-01-2003 à 16:06:10    

SchnapsMann a écrit :

pourquoi fais tu une première passe pour compter les sections *MESHVERTEX ?
 
a priori ca sert à rien :heink:  
 
Et puis sinon des noms de variables explicites ca serait déjà une bonne idée pour du code lisible; par ce que a, b, i ... :o


 
je compte les *MESHVERTEX  pour savoir combien il y a d'objets
et combien de fois la boucle for doit s'éxécuter (une fois par objet)

Reply

Marsh Posté le 26-01-2003 à 16:09:43    

airseb a écrit :


 
je compte les *MESHVERTEX  pour savoir combien il y a d'objets
et combien de fois la boucle for doit s'éxécuter (une fois par objet)  


 
C'est bien ce qui me semblait, la première passe ne sert à rien. En  traitant les sections à la volée ca marcherait aussi bien puisque tu n'as pas besoin de connaitre le nombre de sections pour en traiter une.
 
Pour ce qui est de la nom terminaison de ton programme je te conseille le débugueur parce que la il doit sans doute boucler sur une erreur de parsing.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 26-01-2003 à 16:12:31    

SchnapsMann a écrit :


 
C'est bien ce qui me semblait, la première passe ne sert à rien. En  traitant les sections à la volée ca marcherait aussi bien puisque tu n'as pas besoin de connaitre le nombre de sections pour en traiter une.
 
Pour ce qui est de la nom terminaison de ton programme je te conseille le débugueur parce que la il doit sans doute boucler sur une erreur de parsing.


excuse moi mais : c quoi une erreur de parsing et comment je dois utiliser le debugueur ?

Reply

Marsh Posté le 26-01-2003 à 19:16:14    

Une erreur de parsing, c'est une erreur d'interprétation d'un texte (un fichier texte, dans ton cas). Avec le débuggeur, tu pourras vérifier au fur et à mesure les résultats des "fscanf", et trouver où se situe le problème. Mais pour apprendre à l'utiliser, mieux vaux lire la doc fournie avec (et surtout, ça dépend de ton environnement de travail).

Reply

Marsh Posté le 26-01-2003 à 22:09:11    

Quelques conseils
1. indente un peux mieux...
2. évite les do... while pour parser, vaut mieux un while tout seul, le "do" implique que le code est executé au moins une fois, c'est dangereux!!
3. fscanf revoie comme valeur de retour le nombre paramètres lus, ça pourrait t'aider.
4. %d%f%f%f à éviter, ou alors écris le séparateur entre les formats, c'est plus clair.
5. un mélange de C et de C++, c'est assez casse-gueule (fscanf et cout, ça fait tache, ainsi que stdio.h et iostream.h )
6. fscanf et "%s%s%s", c'est trèèès casse geule
7. les variables globales sont à proscrire dans la majorité des cas!!!


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 26-01-2003 à 22:09:11   

Reply

Marsh Posté le 27-01-2003 à 03:14:04    

feof n'est vrai que lorsqu'une lecture a échoué, pas dès que la prochaine va échouer.
 
Je ne me suis pas attardé sur le reste...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 27-01-2003 à 09:20:13    

Angel_Eyes a écrit :

Quelques conseils
1. indente un peux mieux...
2. évite les do... while pour parser, vaut mieux un while tout seul, le "do" implique que le code est executé au moins une fois, c'est dangereux!!
3. fscanf revoie comme valeur de retour le nombre paramètres lus, ça pourrait t'aider.
4. %d%f%f%f à éviter, ou alors écris le séparateur entre les formats, c'est plus clair.
5. un mélange de C et de C++, c'est assez casse-gueule (fscanf et cout, ça fait tache, ainsi que stdio.h et iostream.h )
6. fscanf et "%s%s%s", c'est trèèès casse geule
7. les variables globales sont à proscrire dans la majorité des cas!!!


 
merci pour tes conseils  :D  
mais je voudrais savoir pourquoi : fscanf et "%s%s%s" c casse gueule ?

Reply

Marsh Posté le 27-01-2003 à 13:34:02    

un scanf (sscanf, fscanf, ...) s'arrete sur le premier caractère ne correspondant pas à la valeur recherchée.
 
par exemple %d s'arrete à une lettre, une virgule ou autre chose n'étant pas un chiffre.  
 
pour %s, il lit une chaine de caractères et s'arrete sur un caractère interprèté comme séparateurs d'une manière parfois assez tordue (espaces, fin de ligne, fin de chaîne,... pas toujours celui que l'on croit), c'est pas évident à maitriser si on commence et c'est une belle source d'erreurs.  
 
Faut être sur de la manière dont scanf va séparer ton %s%s%s.


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Sujets relatifs:

Leave a Replay

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