martram
Messages postés17Date d'inscriptionvendredi 13 octobre 2006StatutMembreDernière intervention 2 décembre 2007
-
18 févr. 2007 à 23:11
cs_azamharir
Messages postés55Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 1 novembre 2008
-
20 févr. 2007 à 21:36
Je fais un programme en c++ et j'ai un bug assez bizarre je n,arrive pas à en trouver la cause.. j'aimerais bien que quelqu'un m'aide parce que ça fait plusieurs jours que je tourne en rond à essayer tout et n'importe quoi..
le programme consiste jusqu,a maintenant des structures avec pointeurs dans lequel rentre les données d'un fichier .txt et lequel on affiche après avoir demandé quelque chose à l'usager.. en ce moment tout ce que ça fait c'Est entrer la premier parti des données , puis ça bloque rendu après un tour de la boucle principale , c'Est à dire après "1 professeur"(selon mon type de donnée) j'ai mis en commentaire un gros "bug ici après second tour" pour mettre en évidence l,emplacement exact ou ça bug..et c'est à la création d'une nouvelle case pour la struct et il me semble que ça devrait fonctionner..
voici le code à problème.. je le met en entier au cas où vous voudriez le voir "fonctionner"..merci
#include
#include <string.h>
#include <stdlib.h>
#include
#include <fstream.h>
const int nb_charac_max=80;
struct Cours
{
char *sigle;
Cours *suivant;
};
if(lecture.fail()) //condition si l'ouverture envoie une erreur
{
cout<<"Erreur a l'ouverture du fichier"<<endl; //message d'erreur
exit(1); //sortir du programme lors d'une erreur
}
while(!lecture.eof()) //boucle qui lit jusqu'à la fin du fichier
{
cout << "again " << endl;
//******************************************
//*********bug ici au second tour***********
profCourant->nom = new char[25];
/********/
printf("profCourant->experience= %d\n", profCourant->experience );
printf("**6\n");
/********/
Cours *coursCourant=profCourant->listecours=new Cours();
coursCourant->suivant=new Cours();
coursCourant=coursCourant->suivant;
Etudiant *etudiantCourant=profCourant->listetudiants=new Etudiant();
etudiantCourant->suivant=new Etudiant();
etudiantCourant=etudiantCourant->suivant;
t = new char [10];
while(!lecture.eof())
{/*******/
printf(" boucle1 \n");
getchar();// pour executer pas à pas
/*********/
coursCourant->sigle = new char [10];
lecture>> t ;
if (t[0]=='&') break;
printf("t= %s\n",t);
strcpy (coursCourant->sigle,t);
printf("coursCourant->sigle= %s\n",coursCourant->sigle);
coursCourant->suivant=new Cours();
coursCourant=coursCourant->suivant;
}
while(!lecture.eof())
{/*******/
printf(" boucle2 \n");
getchar();//pour executer pas à pas
/********/
etudiantCourant->nom = new char [25];
lecture>> t ;
if (t[0]=='&') break;
printf("t= %s\n",t);
strcpy (etudiantCourant->nom,t);
printf("etudiantCourant->nom= %s\n",etudiantCourant->nom);
etudiantCourant->suivant=new Etudiant();
etudiantCourant=etudiantCourant->suivant;
}
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 19 févr. 2007 à 16:50
Salut,
Je te conseille de faire un debug ligne par ligne avec point d'arret sur début du constructeur pour vérif de TOUTES les valeurs,
et aussi d'extraire les allocations dans une méthode dédiée pour plus de clarté lors de la destruction (que je ne vois pas ici)
martram
Messages postés17Date d'inscriptionvendredi 13 octobre 2006StatutMembreDernière intervention 2 décembre 2007 19 févr. 2007 à 18:56
salut
j'ai fait le debug autant que possible.. j'ai pu vérifier que le bug semblait provenir de la ligne profCourant->nom = new char[25]; au second tour de boucle..
aussi, je ne vois pas très bien pourquoi tu parles de destruction, le problème ne peut pas être à ce niveau il me semble..
merci pour ton intrêt à mon problème tout de même..
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_azamharir
Messages postés55Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 1 novembre 2008 20 févr. 2007 à 16:30
salut
essai printf à la place de cout dans le corps du constructeur DossierProfesseur::DossierProfesseur(char *FP) et tu sera vraiment surpris.
pour la 1° fois entré ds la boucle while(!lecture.eof()) : il ne rentre pas ds les 2 boucles
while(t[0]!='&' && !lecture.eof())
et pour la 2° fois il boucle à l'infini à l'interieur de la 1° bouclewhile(t[0]!='&' &&!lecture.eof())
c'est bizzar mais je l'ai testé.
martram
Messages postés17Date d'inscriptionvendredi 13 octobre 2006StatutMembreDernière intervention 2 décembre 2007 20 févr. 2007 à 16:54
la boucle a l'infini c'Est parce qu'il n'a plus de donné à entrer dans la struct donc il ne tombe jamais sur le "&" du document texte..
pour ce qui est des 2 while de suite, c'Est vrai, c'Est un oublie de ma part, cependant ça ne cause pas d'autre problème que d'oublier une boucle, et c'est maintenant règlé.. et pour ce qui est des printf, je ne vois vraiment pas le lien, surtout que les cout sont juste la pour des tests façon de m'éviter de faire des debug à chaque fois.
if(lecture.fail()) //condition si l'ouverture envoie une erreur
{
cout<<"Erreur a l'ouverture du fichier"<<endl; //message d'erreur
exit(1); //sortir du programme lors d'une erreur
}
while(!lecture.eof()) //boucle qui lit jusqu'à la fin du fichier
{
//******************************************
//*********bug ici au second tour***********
profCourant->nom = new char[25];
cout <<"5";
lecture.getline(profCourant->nom, 25);
lecture>>profCourant->experience;
cout << profCourant->experience << "**6";
Cours *coursCourant=profCourant->listecours=new Cours();
coursCourant->suivant=new Cours();
coursCourant=coursCourant->suivant;
Etudiant *etudiantCourant=profCourant->listetudiants=new Etudiant();
etudiantCourant->suivant=new Etudiant();
etudiantCourant=etudiantCourant->suivant;
t = new char [10];
if(lecture.fail()) //condition si l'ouverture envoie une erreur
{
cout<<"Erreur a l'ouverture du fichier"<<endl; //message d'erreur
exit(1); //sortir du programme lors d'une erreur
}
while(!lecture.eof()) //boucle qui lit jusqu'à la fin du fichier
{
//******************************************
//*********bug ici au second tour***********
printf(" again \n");
profCourant->nom = new char[25];
printf("5");
lecture.getline(profCourant->nom, 25);
lecture>>profCourant->experience;
/********/
printf(" %d ", profCourant->experience );
printf("**6");
/********/
Cours *coursCourant=profCourant->listecours=new Cours();
coursCourant->suivant=new Cours();
coursCourant=coursCourant->suivant;
Etudiant *etudiantCourant=profCourant->listetudiants=new Etudiant();
etudiantCourant->suivant=new Etudiant();
etudiantCourant=etudiantCourant->suivant;
t = new char [10];
while(t[0]!='&' && !lecture.eof())
{/*******/
printf(" boucle1 \n");
getchar();// pour voir la boucle infinie qui va etre crée la 2° entrer ds cette boucle
/*********/
coursCourant->sigle = new char [10];
lecture>> t ;
strcpy (coursCourant->sigle,t);
coursCourant->suivant=new Cours();
coursCourant=coursCourant->suivant;
}
lecture>> t;
while(t[0]!='&' && !lecture.eof())
{/*******/
printf(" boucle2 \n");
/********/
etudiantCourant->nom = new char [25];
strcpy (etudiantCourant->nom,t);
lecture>> t;
etudiantCourant->suivant=new Etudiant();
etudiantCourant=etudiantCourant->suivant;
}
etudiantCourant->nom = new char [25];
strcpy (etudiantCourant->nom,t);
coursCourant->suivant= NULL;
etudiantCourant->suivant= NULL;
profCourant->suivant=new Professeur();
profCourant = profCourant->suivant;
profCourant->suivant = NULL;
}
martram
Messages postés17Date d'inscriptionvendredi 13 octobre 2006StatutMembreDernière intervention 2 décembre 2007 20 févr. 2007 à 20:02
je vois la boucle infini.. cependant je sais aussi que la boucle infinie n'est pas la cause , mais le résultat de la cause... La cause étant que les données ne sont plus lu après le premier tour de la boucle principale, ce qui cause la boucle infini... mais la raison pour laquelle les données ne sont plus lu m'est encore inconnue, et dès que je saurai le pourquoi et comment , il n'y aura plus de problème de boucle infini si le document texte est correct.. j'espère que ça aide quelqu'un à y voir plus clair parce que moi j'y vois rien, mais en tout les cas merci de l'intérêt apporté à mon problème
martram
Messages postés17Date d'inscriptionvendredi 13 octobre 2006StatutMembreDernière intervention 2 décembre 2007 20 févr. 2007 à 21:18
salut
merci super beaucoup.. si tu serais une femme je t'embrasserais! :p
pour le problème de boucle d'affichage c'est parce ke t'as enlevé les
coursCourant->suivant= NULL;
etudiantCourant->suivant= NULL;
et mon problème était effectivement dans mes 2 sous boucles..
merci encore t'as fait un super travail!
cs_azamharir
Messages postés55Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 1 novembre 2008 20 févr. 2007 à 21:36
salut
pour BEAUDOIN GUILLAUME il ne lit que GUILLAUME.
donc, à la fin de la boucle grande boucle enleve lecture>> t ; et mets lecture.ignore();
à sa place et il lira BEAUDOIN GUILLAUME en entier.
et pour l'affichage c l'absence de machin.suivant->=NULL qui est la cause comme t'a pu le voir.