Bug dans mon prog d ou cela pourrait venir ?

Bug dans mon prog d ou cela pourrait venir ? - C++ - Programmation

Marsh Posté le 07-04-2004 à 01:16:57    

:hello: ,
alors voila le pb,
mon programme ouvre un fichier, le lis fait des trucs (ici inserer les chiffres du fichiers dans un binary search tree) ferme le fichier.
et renvoie au menu.

Code :
  1. menu
  2. 1. create a binary search tree //a partir d un fichier
  3. 2. Draw tree //de haut en bas
  4. 3. balance tree
  5. 4. save tree //dans un fichier en preorder
  6. 5. quit


 
le point 1 marche au premier lancement mais si une fois retorner au menu je veus creer un autre arbre binaire avec un fichier different (ec : in1.txt) il me dit fichier introuvalbe.. alors que si je ferme le prog et le relance la sa marhce.
 
j aipense a un close oublier masi apperement non..
 
voila le code :

Code :
  1. case 1 : {
  2.             string in;
  3.             cout << "Please enter name of data file "<<endl;
  4.             cin >> in;
  5.             infile.open(in.c_str());
  6.             if (infile.fail())
  7.             {
  8.                   cerr << "Cannot find " << in.c_str() << "\n";
  9.                   //cin.clear();
  10.                   break;
  11.             }
  12.             int element;
  13.             while(infile >> element)
  14.             {
  15.                 mytree.insert(element);
  16.             }
  17.             infile.close();
  18.             break;
  19.             }


 
une idee ?  :)  
 

Reply

Marsh Posté le 07-04-2004 à 01:16:57   

Reply

Marsh Posté le 07-04-2004 à 01:21:13    

et il est défini ou ton infile ? faut peut être lui refaire sa fête pour tout nettoyer :o

Reply

Marsh Posté le 07-04-2004 à 01:40:33    

ah we ca marche mieux tout d un coup :)
bon il me reste a detruire lancien arbre avant de rajouter les donnes du nouveau.
 
merci !

Reply

Marsh Posté le 07-04-2004 à 02:48:29    

j ai un autre problem en rapport avec les objets   [:dams86]
 
l objet btree mytree est cree au tout debut du main.
ensuite si l option est "2" il lance mytree.print()
si c est "1" mytree.insert()  
ect..
 
Maintenant une fois l arbre creer et que je retourne sue l option 1
il me faut repartir a zero et soit, detruire toutes les nodes de mytree soit creer un nouvel objet mytree.
 
ma fonction des ~btree

Code :
  1. btree::~btree() {    destroyTree(root); }
  2. void btree::destroyTree(tree t)
  3. {
  4.   if(t!=NULL )
  5.   {
  6.     destroyTree(t->left);
  7.     destroyTree(t->right);
  8.     cout << "t-> data : " << t->data << " deleted ! " << endl;
  9.     delete t;
  10.   }
  11. }


 
mais le problem c est que sa plante dans un cas particulier :
si mon fichier in1 est plus petit en nombre d element que in2.
in1 < in2 < in3 ... la nouvel insertion se passe bien.
sinon (in1 > in2) sa plante a linsertion.
et je narrive pas a voir pourquoi.
 
donc le mieux je pense serait de creer un nouvel objet a chauqe insertion, mais la il y a un pb c est que comment pouraije faire pour les fonction mytree.print() mytree.save() ? car elles on besoin de savoir ce qu est mytree avant l insertion.  
 
exemple :

Code :
  1. switch (choice)
  2.    {
  3.       case 1 : {
  4.             string in;
  5.             ifstream infile;
  6.             cout << "Please enter name of data file "<<endl;
  7.             cin >> in;
  8.             infile.open(in.c_str());
  9.             if (infile.fail())
  10.             {
  11.                   cerr << "Cannot find " << in.c_str() << "\n";
  12.                   cin.clear();
  13.                   break;
  14.             }
  15.             int element;
  16.           mytree.~btree();
  17.             while(infile >> element)
  18.             {
  19.                    mytree.insert(element);
  20.             }
  21.             infile.close();
  22.             break;
  23.             }
  24.      
  25.        case 2 : {
  26.             mytree.printUpRight();
  27.             break;
  28.             }
  29.                              
  30.        case 4 : {
  31.             string out;
  32.             cout << "Please enter name of output file "<<endl;
  33.             cin >> out;
  34.             mytree.writePreOrder(out);
  35.             break;
  36.        }
  37.        case 5 : return 0; break; //destroy tree
  38.    }
  39.   }


 
la fonction insert

Code :
  1. void btree::insert(int data) {insertSlave(data, root);}
  2. void btree::insertSlave(int data, tree& t) {
  3.     if (t == NULL) {
  4.     t = new node;
  5.     t->left = NULL;
  6.     t->right = NULL;
  7.     t->data = data;
  8.     }
  9.     else  {
  10.     if (data < t->data) insertSlave (data, t->left);
  11.     else if (data > t->data) insertSlave  (data, t->right);
  12.     else cerr << "element already in place" << endl;
  13.     }
  14. }


 
une histoire de pointeur ? :sweat:

Reply

Marsh Posté le 07-04-2004 à 03:15:38    

c'est quoi ces conneries d'appeler le destructeur ? soit tu fais un membre clear() soit un objet local.
 
utilises un debugger

Reply

Marsh Posté le 07-04-2004 à 04:06:22    

Taz a écrit :

c'est quoi ces conneries d'appeler le destructeur ? soit tu fais un membre clear() soit un objet local.
 
utilises un debugger


 [:alarmclock119]  

Code :
  1. void btree::clear() {
  2. if (root==NULL) {
  3.     cout << "root null " << endl;
  4.     return;
  5.     }
  6. _clear(root);
  7. root=NULL;
  8. }
  9. void btree::_clear(tree t) {
  10.   if(t!=NULL )
  11.   {
  12.     _clear(t->left);
  13.     _clear(t->right);
  14.     cout << "t-> data : " << t->data << " deleted ! " << endl;
  15.     delete t;
  16.     }
  17. }


ca marhce weeeeee  :hello:

Reply

Sujets relatifs:

Leave a Replay

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