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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°983712
dreamanoir
Posté le 16-02-2005 à 16:50:04  profilanswer
 

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

mood
Publicité
Posté le 16-02-2005 à 16:50:04  profilanswer
 

n°983740
Taz
bisounours-codeur
Posté le 16-02-2005 à 17:01:06  profilanswer
 

joli ton C

n°983814
dreamanoir
Posté le 16-02-2005 à 17:55:36  profilanswer
 

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

n°983865
Tarabiscot​e
Posté le 16-02-2005 à 18:37:05  profilanswer
 

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
n°983885
dreamanoir
Posté le 16-02-2005 à 18:49:48  profilanswer
 

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
n°983893
Taz
bisounours-codeur
Posté le 16-02-2005 à 18:59:05  profilanswer
 

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 ?

n°983896
masklinn
í dag viðrar vel til loftárása
Posté le 16-02-2005 à 19:03:18  profilanswer
 

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
n°984201
Tarabiscot​e
Posté le 16-02-2005 à 22:58:13  profilanswer
 

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

n°984739
dreamanoir
Posté le 17-02-2005 à 11:57:33  profilanswer
 

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

n°984741
masklinn
í dag viðrar vel til loftárása
Posté le 17-02-2005 à 11:58:30  profilanswer
 

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
mood
Publicité
Posté le 17-02-2005 à 11:58:30  profilanswer
 

n°984771
Stroustrup​-Junior
Posté le 17-02-2005 à 12:43:25  profilanswer
 

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


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

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

 

Sujets relatifs
Incorporer des fichier à son exeprobleme d'insertion dans Mysql avec easyphp
Probleme avec request.getRequestDispatcher()PROBLEME AVEC " mms:// "
[Eclipse] Recuperer un nom de fichierVBS connaitre la date de modification d'un fichier
Problème d'overflow d'un cadre sur IE : ça foire en largeur [Résolu]problème filtrage données table
Pointeur sur un fichier !![ C vs Bash ] Détecter les lignes vides d'un fichier texte
Plus de sujets relatifs à : Problème de Procedure avec liste chainée et fichier


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