begin process at 2012 05 28 14:52:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

bug introuvable, structs pointeurs


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

bug introuvable, structs pointeurs

dimanche 18 février 2007 à 23:11:45 | bug introuvable, structs pointeurs

martram

Membre Club

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 <iomanip.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
const int nb_charac_max=80;
struct Cours
{
    char *sigle;
    Cours *suivant;
};

struct Etudiant
{
    char *nom;
    Etudiant *suivant;
};

struct Professeur
{
    char *nom;
    int experience;
    Cours *listecours;
    Etudiant *listetudiants;
    Professeur *suivant;
};


class DossierProfesseur
{
  
       
    public:
  Professeur *tete;
        DossierProfesseur(char *FP);
        ~DossierProfesseur();
  void affichage();

 
};

DossierProfesseur::DossierProfesseur(char *FP)
{
 char * t ;
 Professeur *profCourant=tete=new Professeur();
 cout<< "2";
 profCourant->suivant=new Professeur();
 cout<< "3";
 profCourant = profCourant->suivant; 
 
 ifstream lecture(FP,ios::nocreate);
 
 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];     

  cout <<"5";
  lecture.getline(profCourant->nom, nb_charac_max);
  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];         // A remplacer dynamiquement !
   
  while(t[0]!='&' && !lecture.eof())
  {
   lecture>> t ;
   coursCourant->sigle = new char [10];               
   strcpy (coursCourant->sigle,t);
   coursCourant->suivant=new Cours();
   coursCourant=coursCourant->suivant;
  
   
  }
  while(t[0]!='&' && !lecture.eof())
  {
   lecture>> t;
   etudiantCourant->nom = new char [20];               
   strcpy (etudiantCourant->nom,t);
   etudiantCourant->suivant=new Etudiant();
   etudiantCourant=etudiantCourant->suivant;
  
   
  }
  cout<< "1";
  coursCourant->suivant= NULL;
  cout<< "1 1/2";
  etudiantCourant->suivant= NULL;
  
  profCourant->suivant=new Professeur();
 
  cout<< "3";
  profCourant = profCourant->suivant; 
  
  cout<< "4";
  profCourant->suivant = NULL;
 }

 
 
}

void DossierProfesseur::affichage()
{
    Professeur *profCourant=tete;
    profCourant=profCourant->suivant;
    
    while(profCourant->suivant!=NULL)
    {
       
        cout << profCourant->nom      << endl;
        cout << profCourant->experience   << endl;
        cout << "------------------------------------------------" << endl;
        //liste des cours pour ce prof
        Cours *coursCourant=profCourant->listecours;
        while(coursCourant->suivant!=NULL)
        {
            coursCourant=coursCourant->suivant;
            cout << coursCourant->sigle << endl;
        }

        profCourant=profCourant->suivant;
    }
}

void  main()
{
   
 char option_menu[1];
 char text_option_menu[nb_charac_max];
 cout << "Quel action desirez vous effectuer? (- nom et prenom, *, % nom du cours, $ nom du fichier)";
 cin >> option_menu[0];
 cin.ignore(2, '[');
 cin.get(text_option_menu, nb_charac_max,']');


 switch(option_menu[0]){
 case '-':cout << "supprimer" << endl << text_option_menu << endl;break;
 case '*':cout << "nom plus demander";break;
 case '%':cout << "cours";break;
 case '$':cout << "sauvegarde";break;
 };

    DossierProfesseur *dossierProfesseur;
   
 dossierProfesseur= new DossierProfesseur("fp.txt");
  
    dossierProfesseur->affichage();

};

dimanche 18 février 2007 à 23:14:46 | Re : bug introuvable, structs pointeurs

martram

Membre Club
ah et le fichier txt ressemble à ceci, merci encore

GAGNON PIERRE LUC
15
SIF100
SIF101
SIF104
SIF106
&
BOUDREAULT
COTE
VILLENEUVE
FLAMAND
DERY
&
BEAUDOIN GUILLAUME
20
SIF102
SIF103
SIF100
SIF104
&
DERY
FILLION
VERREAULT
FLAMAND
COTE
lundi 19 février 2007 à 16:50:07 | Re : bug introuvable, structs pointeurs

yann_lo_san

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)

lundi 19 février 2007 à 18:56:13 | Re : bug introuvable, structs pointeurs

martram

Membre Club

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

mardi 20 février 2007 à 11:54:52 | Re : bug introuvable, structs pointeurs

goast_tu

profCourant->nom = new char[25];     

  cout <<"5";
  lecture.getline(profCourant->nom, nb_charac_max);

je n'ai pas fais du C++ (que du C) mais d'apres ce que je comprend tu reserve de l'espace pour 25 caracters et ensuit tu essay de lire le nom de nb_charac_max caracters(donc 80) c'est deja une erreur. Mais je pence pas que ca vien de la car aucun nom dans le fichier ne depasse pas 25 caracters




Trafic web gratuit!!!
mardi 20 février 2007 à 16:07:27 | Re : bug introuvable, structs pointeurs

martram

Membre Club

salut

bien vu, mais effectivement ce n'est pas le problème. j'ai corrigé, et ça ne change rien. merci d'essayer tout de même

mardi 20 février 2007 à 16:30:57 | Re : bug introuvable, structs pointeurs

azamharir

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° boucle
while(t[0]!='&' &&!lecture.eof())
c'est bizzar mais je l'ai testé.


mardi 20 février 2007 à 16:54:57 | Re : bug introuvable, structs pointeurs

martram

Membre Club
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.
mardi 20 février 2007 à 17:39:06 | Re : bug introuvable, structs pointeurs

azamharir

salut
envois ton programme avec les modifications que t'as faite. pour voir plus clair.

mardi 20 février 2007 à 18:08:32 | Re : bug introuvable, structs pointeurs

martram

Membre Club

#include <iomanip.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
const int nb_charac_max=80;
struct Cours
{
    char *sigle;
    Cours *suivant;
};

struct Etudiant
{
    char *nom;
    Etudiant *suivant;
};

struct Professeur
{
    char *nom;
    int experience;
    Cours *listecours;
    Etudiant *listetudiants;
    Professeur *suivant;
};


class DossierProfesseur
{
  
       
    public:
  Professeur *tete;
        DossierProfesseur(char *FP);
        ~DossierProfesseur();
  void affichage();
        //void supprimer(char *nom);
        //void afficherLaListe() const;
        char *afficherLeProfSuperviseEtudiant(char *nom) const;
        //char *afficherProfexperienceDuCoursPlusDemande(char *coursdonne) const;
        //int afficherCoursLePlusDemande() const;
        //void recopier(char *FP);
};
/*DossierProfesseur::
{
 

}*/

DossierProfesseur::DossierProfesseur(char *FP)
{
 char * t ;
 Professeur *profCourant=tete=new Professeur();
 cout<< "2";
 profCourant->suivant=new Professeur();
 cout<< "3";
 profCourant = profCourant->suivant; 
 
 ifstream lecture(FP,ios::nocreate);
 
 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]; 

  while(t[0]!='&' && !lecture.eof())
  {
   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())
  {
   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;
 }


 
}

void DossierProfesseur::affichage()
{
    Professeur *profCourant=tete;
    profCourant=profCourant->suivant;
    
    while(profCourant->suivant!=NULL)
    {
       
        cout << profCourant->nom      << endl;
        cout << profCourant->experience   << endl;
        cout << "------------------------------------------------" << endl;
        //liste des cours pour ce prof
        Cours *coursCourant=profCourant->listecours;
        while(coursCourant->suivant!=NULL)
        {
            coursCourant=coursCourant->suivant;
            cout << coursCourant->sigle << endl;
        }
  profCourant=profCourant->suivant;
    }
}

void  main()
{
   
 char option_menu[1];
 char text_option_menu[nb_charac_max];
 cout << "Quel action desirez vous effectuer? (- nom et prenom, *, % nom du cours, $ nom du fichier)";
 cin >> option_menu[0];
 cin.ignore(2, '[');
 cin.get(text_option_menu, nb_charac_max,']');


 switch(option_menu[0]){
 case '-':cout << "supprimer" << endl << text_option_menu << endl;break;
 case '*':cout << "nom plus demander";break;
 case '%':cout << "cours";break;
 case '$':cout << "sauvegarde";break;
 };

    DossierProfesseur *dossierProfesseur;
    dossierProfesseur= new DossierProfesseur("fp.txt");
    dossierProfesseur->affichage();

};


1 2

Cette discussion est classée dans : char, cout, profcourant, courscourant, dossierprofesseur


Répondre à ce message

Sujets en rapport avec ce message

Ecriture/lecture dans un fichier [ par SneakGuy ] Haaa... Merci, sa m'a aider... Enfin, j'ai encore plusieurs problemes...pour l'ecriture j'ai quelque chose qui ressemble a sa:char user[20];char pass[ j'ai commencé un sof mais je bloque ! :( [ par xionoxid ] Voilà quand je demande rentré le pass si il met "a" alors ça devrait faire login = rien; mais le probleme c'est que meme si je met a et ça fait PAS lo Visual C++ Free() [ par PRZYBYLSKI ] #include #include #include "stdafx.h"Question au Pro?Qu'es qui est faux docteurArrivé à free ça bombe#include <io Extraire une chaine de caractère en retirant les espaces... [ par Fituza ] Bonsoir,Je pose ici une question qui doit paraître évident pour la plupart d'entre vous mais enfin... voici le programme de base:_____________________ Dans le genre prenant........ [ par Xs ] oui !c 'est trés chiant !j'explique mon pb : j'ai un code source, fais par moi-meme, et dedans, je veux que l'on saisisse des renseignement comme le l probleme sur une classe [ par NerOcrO ] Voici mon code :#include #include class Chanson //classe Chanson{ public: int Duree; char TypeDeFichier[3], Auteur[50], Titre[50], Interprete[50 help me !!! [ par pascal13 ] j arrive pas a compiler mon programme...je sais que g qlq que souccis au niveau de la sauvegarde des données sur le fichier toutes remarques seront le probleme ecriture base avec ADO [ par Fikren ] Bonjour,J'utilise ADO pour gerer une base de donnees devant recueillir des informations utilisateurs.J'ai tout d abord tester les differentes methodes comparation chaine de caractere [ par SfyLer ] prise de tête j'arrive pas a comparer de chaine de caractere:#include #include char main(void){ char login[6]; cout cin >> login; cout << "\n";<b s il vous plait g besoin d aide vite pour mon projet....§§§§§ [ par greamlens ] s il vous plait g besoin d une solution pour un projet qui consiste a inserer un message caché en binaire sur les bits les moins significatifsje crois


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,310 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales