Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2465 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°294287
airseb
Posté le 26-01-2003 à 14:41:40  profilanswer
 

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
mood
Publicité
Posté le 26-01-2003 à 14:41:40  profilanswer
 

n°294323
airseb
Posté le 26-01-2003 à 15:39:14  profilanswer
 

:hello:

n°294327
Taz
bisounours-codeur
Posté le 26-01-2003 à 15:47:25  profilanswer
 

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

n°294329
schnapsman​n
Zaford Beeblefect
Posté le 26-01-2003 à 15:49:43  profilanswer
 

++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!"
n°294334
schnapsman​n
Zaford Beeblefect
Posté le 26-01-2003 à 15:57:59  profilanswer
 

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!"
n°294336
airseb
Posté le 26-01-2003 à 16:06:10  profilanswer
 

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)

n°294338
schnapsman​n
Zaford Beeblefect
Posté le 26-01-2003 à 16:09:43  profilanswer
 

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!"
n°294339
airseb
Posté le 26-01-2003 à 16:12:31  profilanswer
 

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 ?

n°294415
nnovic
Posté le 26-01-2003 à 19:16:14  profilanswer
 

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).

n°294523
Angel_Eyes
Wait & see...
Posté le 26-01-2003 à 22:09:11  profilanswer
 

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:  
mood
Publicité
Posté le 26-01-2003 à 22:09:11  profilanswer
 

n°294575
Musaran
Cerveaulté
Posté le 27-01-2003 à 03:14:04  profilanswer
 

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
n°294614
airseb
Posté le 27-01-2003 à 09:20:13  profilanswer
 

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 ?

n°294790
Angel_Eyes
Wait & see...
Posté le 27-01-2003 à 13:34:02  profilanswer
 

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:  

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
formulaire :--> upload d'un fichier image[c] Executer un programme en le cachant
Un petit programme pour lancer des processus en parallele?[batch] Lire un fichier et extraire une ligne
Piloter 2 cartes sons via un programme.Import de données au format access (fichier mdb) par un utilisateur
[problème] programme en assembleur pour convertir lettre en hexaComment utiliser un bot dans un programme externe???
Copie d'un fichier dans un tableau a 2 entrées de stringDécompiler une fichier exe ?
Plus de sujets relatifs à : mon programme qui lit dans un fichier .ase ne se termine jamais !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR