Problème de Procedure avec liste chainée et fichier

Problème de Procedure avec liste chainée et fichier - C++ - Programmation

Marsh Posté le 16-02-2005 à 16:50:04    

Voila je recupere grace a la procedure chargement les données concernant un client dans un fichier texte.
Je veux ensuite intégrer ces données dans une liste chainée
La procédure s'éxécute correctement mais lorsqu'elle se termine turbo c++ se ferme et j'ai le message suivant :  
"Turbo c++ IDE  
Le processeur NTVDM a rencontré une instruction non autorisée.  
CS:8b3c IP:69e8 OP:f023 fa 23 04 Choisissez 'FERMER' pour mettre fin à l'application"  
 
Je n'arrive pas a comprendre de quoi cela peut venir.
 
Ci dessous le code de ma procedure ainsi que de ma liste chainée :

Code :
  1. //procedure de chargement depuis un fichier  
  2. void chargement(liste_client &lst_cli)
  3. {
  4.    client *ptrnew;
  5.    char *s_client;
  6.    char *pointeur_chaine;
  7.    char nom[30], prenom[30], adresse[50], cp[30], ville[50];
  8.    ifstream fic("clients.txt",iso::in);
  9.    cout << "Ouverture de fichier" << fic;
  10.    getch();
  11.    if(!fic)//si le fichier n'a pas pu etre ouvert  
  12.    {
  13.       cout << "Le fichier n'a pas pu etre ouvert";
  14.       getch();
  15.      
  16.    }
  17.    else//fichier ouvert  
  18.    {
  19.       cout << "Fichier Ouvert";
  20.       getch();
  21.       fic.getLine(s_client,250);
  22.       //nom  
  23.       pointeur_chaine=strtok(s_client,";" );
  24.       strcpy(nom,pointeur_chaine);
  25.       //prenom  
  26.       pointeur_chaine=strtok(NULL,";" );
  27.       strcpy(prenom,pointeur_chaine);
  28.       //adresse  
  29.       pointeur_chaine=strtok(NULL,";" );
  30.       strcpy(adresse,pointeur_chaine);
  31.       //cp  
  32.       pointeur_chaine=strtok(NULL,";" );
  33.       strcpy(cp,pointeur_chaine);
  34.       //ville  
  35.       pointeur_chaine=strtok(NULL,"\n" );
  36.       strcpy(ville,pointeur_chaine);
  37.       cout << nom << endl << prenom << endl << adresse << endl << cp << endl << ville;
  38.       //ptrnew=new client(nom,prenom,adresse,cp,ville);  
  39.       //lst_cli.ajouter(ptrnew);  
  40.        
  41.       fic.fclose();
  42.    }
  43. }
  44. //classe liste_client  
  45. class liste_client
  46. {
  47.    private:
  48.    int nbclient;
  49.    client *ptrTete;//pointeur de tete de la liste  
  50.    client *ptrCour;//pointeur courant  
  51.    public:
  52.    void affichage();
  53.    void ajouter(client *ptrnew);
  54.    liste_client();
  55.    ~liste_client();
  56. };
  57. //constructeur  
  58. liste_client::liste_client()
  59. {
  60.    ptrTete=new client;
  61.    ptrTete=0;
  62.    ptrCour=new client;
  63.    ptrTete=0;
  64. }
  65. //destructeur de liste
  66. liste_client::~liste_client()
  67. {
  68.           client *ptr;
  69.           ptr=ptrTete;
  70.           while (ptr!=NULL)
  71.           {
  72.                 client *ptr2=ptr;
  73.                 ptr=ptr->ptrsuiv;
  74.                 delete ptr2;
  75.            }
  76.            delete ptr;
  77. }
  78. //procedure d'ajout d'un client dans la liste chainee  
  79. void liste_client::ajouter(client *ptrnew)
  80. {
  81.    ptrnew->set_ptrsuiv(0);
  82.    if (ptrTete==0)
  83.    {
  84.       ptrCour=ptrnew;
  85.       ptrTete=ptrTete;
  86.    }
  87.    else
  88.    {
  89.       ptrCour->set_ptrsuiv(ptrnew);
  90.       ptrCour=ptrnew;
  91.    }
  92.    nbclient++;
  93. }
  94. //procedure d'affichage  
  95. void liste_client::affichage()
  96. {
  97.    cout << "\nNom : " << ptrCour->get_nom();
  98.    cout << "\nPrenm : " << ptrCour->get_prenom();
  99.    cout << "\nAdresse : " << ptrCour->get_adresse();
  100.    cout << "\nCp : " << ptrCour->get_cp();
  101.    cout << "\nVille : " << ptrCour->get_ville();
  102. }


 
Si vous arrivez a m'aider ça serait vraiment bien car ça fait une semaine que je suis sur ce problème

Reply

Marsh Posté le 16-02-2005 à 16:50:04   

Reply

Marsh Posté le 16-02-2005 à 17:01:06    

joli ton C

Reply

Marsh Posté le 16-02-2005 à 17:55:36    

ça veut dire quoi ça?
ta réponse me fait énormément avancer dans mon problème merci bien!

Reply

Marsh Posté le 16-02-2005 à 18:37:05    

Je vois beaucoup d'erreurs et me demande comment tu arrives a compiler ce code, mais le plus bizare, c'est ton constructeur :
 

Code :
  1. liste_client::liste_client() 
  2.    ptrTete=new client; 
  3.    ptrTete=0; 
  4.    ptrCour=new client; 
  5.    ptrTete=0; 
  6. }


 
Pourquoi tu mets deux fois 0 dans ptrTete, et pourquoi crée-tu deux clients (dont un est perdu dans la memoire après ton 1er ptrTete=0; )


Message édité par Tarabiscote le 16-02-2005 à 18:37:40
Reply

Marsh Posté le 16-02-2005 à 18:49:48    

Oui effectivement je n'avais pas vu cette erreur :
voila ce que ça donne :  

Code :
  1. liste_client::liste_client() 
  2.     { 
  3.         ptrTete=new client; 
  4.         ptrTete=0; 
  5.         ptrCour=new client; 
  6.         ptrCour=0; 
  7.      }


 
Le premier poiteur me sert de pointeur de tete de ma liste et le deuxieme de poiteur courant que je vais utiliser pour la lecture et l'insertion par la suite dans mon programme.
 
Où as-tu vu d'autres erreurs?


Message édité par dreamanoir le 16-02-2005 à 18:50:18
Reply

Marsh Posté le 16-02-2005 à 18:59:05    

et sinon, niveau logique, quand tu fais
 
x = y;
x = z;
 
est-ce que t'as pas l'impression que la première instruction ne sert à rien ?

Reply

Marsh Posté le 16-02-2005 à 19:03:18    

dreamanoir a écrit :

Oui effectivement je n'avais pas vu cette erreur :
voila ce que ça donne :  

Code :
  1. liste_client::liste_client() 
  2.     { 
  3.         ptrTete=new client; 
  4.         ptrTete=0; 
  5.         ptrCour=new client; 
  6.         ptrCour=0; 
  7.      }


 
Le premier poiteur me sert de pointeur de tete de ma liste et le deuxieme de poiteur courant que je vais utiliser pour la lecture et l'insertion par la suite dans mon programme.


Justement ça n'a pas de sens, d'abord tu crées un objet (avec ton new) puis tu affectes 0 à tes pointeurs... donc tu "perds" tes objets sans même les désallouer et toute tentative d'appel à tes pointeurs va merder/planter vu qu'ils pointent sur un truc sans aucun rapport (l'espace mémoire de position 0)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-02-2005 à 22:58:13    

Bon aller 2 autres petits trucs :
 
ligne 87 : a quoi sert delete ptr ? (a ce moment la ptr vaut NULL donc cette instruction est inutile)
 
ligne 97 : ptrTete=ptrTete (étrange non ?)

Reply

Marsh Posté le 17-02-2005 à 11:57:33    

merci pour vos réponses.
Le problème vient du fait que je n'alloue pas de mémoire a s_client ligne 5.
Je vais changer de compilateur parceque avec turbo c++ je n'arrive pas a faire marcher std::string
 
merci encore

Reply

Marsh Posté le 17-02-2005 à 11:58:30    

dreamanoir a écrit :

merci pour vos réponses.
Le problème vient du fait que je n'alloue pas de mémoire a s_client ligne 5.


C'est sûrement pas le seul problème :sweat:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-02-2005 à 11:58:30   

Reply

Marsh Posté le 17-02-2005 à 12:43:25    

Pourquoi ne pas utiliser une std::list pour se focaliser sur les vrais problèmes ?

Reply

Sujets relatifs:

Leave a Replay

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