passage par référence

passage par référence - C++ - Programmation

Marsh Posté le 10-06-2008 à 10:58:19    

Bonjour,
 
 
j'ai un petit probleme dans mon passage par référence dans une fonctionne puisque les parametres modifiés dans la fonction ne sont pas répercutés a la sortie de celle ci.
 
j'ai la fonction suivante (pas tres bien programmé mais bon c'est le début) :
 

Code :
  1. void createData(const string fileMID, const string fileMIF, vector < vector<string>> & myData, vector <int> &myType, vector <string> &myNameVariable,vector <string> &min,vector <string> &max)


 
et je l'appelle comme cela :
 

Code :
  1. const string fileMID = "data/DED.MID"; // string which contains path to MIF file
  2. const string fileMIF = "data/DED.MIF"; // string which contains path to MIF file
  3. vector < vector<string>> myData; // vector which contains my data
  4. vector <int> myType; // vector which contains type of the data
  5. vector <string> myNameVariable; // vector wich contains name of the data
  6. vector <string> min ; // min of data
  7. vector <string> max; // max of data
  8. createData(fileMID, fileMIF, myData, myType, myNameVariable, min,max);


 
dans la fonction (en mode debug) toutes les variables sont modifiés avec les bonnes valeurs.
par contre quand je sors de ma fonction toujours en mode debug mes vecteurs n'ont plus la meme taille et surtout ont des valeurs comme 0 ou -1163005939
 
j'utilise visual express c++ 2008 sous windows XP.
 
est ce que j'ai rien compris au passage par référence ou c'est juste une petite erreure quelque part ? (ou peut etre une erreure du compilo mais je pense plutot pour une erreur de ma part vu mon niveau !)

Reply

Marsh Posté le 10-06-2008 à 10:58:19   

Reply

Marsh Posté le 10-06-2008 à 11:20:18    

Salut,  
 
Une petite chose m'a sauté aux yeux dans ton code :
[...]vector < vector<string>> & myData, [...]
Les deux chevrons fermants du double "vector" sont collés. Le compilo les interprète comme un opérateur de flux ">>".
 
Mets un espace entre les deux '>'. Ça devrait marcher un peu mieux.

Reply

Marsh Posté le 10-06-2008 à 11:25:02    

jxano a écrit :

Salut,  
 
Une petite chose m'a sauté aux yeux dans ton code :
[...]vector < vector<string>> & myData, [...]
Les deux chevrons fermants du double "vector" sont collés. Le compilo les interprète comme un opérateur de flux ">>".
 
Mets un espace entre les deux '>'. Ça devrait marcher un peu mieux.


 
 
hélas non le probleme ne vient pas de la. j'ai corrigé le code et a l'exécution j'ai toujours le meme probleme.  :(

Reply

Marsh Posté le 10-06-2008 à 11:51:21    

en fait je viens de faire un test en mettant tout en commentaire et en ayant dans mon code que les lignes suivantes :
 

Code :
  1. // string library : use type string
  2. #include <string>
  3. using namespace std ;
  4. // vector librairy : use type vector
  5. #include <vector>
  6. using std::vector;
  7. int main(int argc, char *argv[]){
  8. vector <string> max; // max of data
  9. max.push_back("1" );
  10. max.push_back("mot" );
  11. max.push_back("mot" );
  12. return 0;
  13. }


 
et en mode debug toujours quand je fais une visualisation des donnees max reste toujours comme cela :
 

Code :
  1. max [0]() std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >


 
j'ai en fait l'empression que mon code n'est pas exécuté meme si il s'arrete bien sur la ligne avec les breakpoints em mode debug.

Reply

Marsh Posté le 10-06-2008 à 12:09:09    

Si tu utilise visual vire l'optimisation du code des fois ça fait des trucs chelou en debug


---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 10-06-2008 à 12:23:46    

kyntriad a écrit :

Si tu utilise visual vire l'optimisation du code des fois ça fait des trucs chelou en debug


 
 
il était déja désactivé. donc en fait j'ai supprimé toutes mes classes et je les aient remise apres et tout fonctionne maintenant.
les mysteres de la compilation  :lol:

Reply

Marsh Posté le 10-06-2008 à 12:28:27    

Code :
  1. // string library : use type string
  2. #include <string>
  3. // vector librairy : use type vector
  4. #include <vector>
  5. using namespace std ;
  6. int main(int argc, char *argv[]){
  7. vector <string> max; // max of data
  8. max.push_back("1" );
  9. max.push_back("mot" );
  10. max.push_back("mot" );
  11. return 0;
  12. }


 
À mon avis, le namespace std::vector n'est pas très utile, mais je peux me tromper.
 
Comment visualise-tu les données ? Perso, j'utiliserais un itérateur pour lire le vecteur :

Code :
  1. for (vector<string>::iterator i= max.begin(); i!=max.end(); i++)
  2.     {
  3.     cout << *i << " ";
  4.     }


Reply

Marsh Posté le 10-06-2008 à 12:40:48    

jxano a écrit :

[cpp]
 
Comment visualise-tu les données ? Perso, j'utiliserais un itérateur pour lire le vecteur :
 


 
en mode debug tu peux "voir" les données locales dans une fenetre séparée avec le nom de la variables, sa valeur et son type. c'est tres pratique quand tu as beaucoup de gros tableaux par exemples

Reply

Marsh Posté le 10-06-2008 à 16:24:38    

jxano a écrit :


Comment visualise-tu les données ? Perso, j'utiliserais un itérateur pour lire le vecteur :

Code :
  1. for (vector<string>::iterator i= max.begin(); i!=max.end(); i++)
  2.     {
  3.     cout << *i << " ";
  4.     }




 
Mon oreillette me dit :
 

Code :
  1. vector<int> V;
  2. // ...
  3. copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n" ));


 
Sinon t'as testé un passage par ref simpel dans une fonction débile ?

Reply

Marsh Posté le 29-06-2008 à 12:43:23    

Bonjour,
 
Pardon de reprendre cette vieille discussion...

Citation :

Mon oreillette me dit :  

Code :
  1. vector<int> V;
  2. // ...  
  3. copy(V.begin(), V.end(), ostream_iterator<int>(cout, "\n" ));



Par acquis de conscience, j'ai essayé l'algorithme "copy()" dans un de mes programmes.
 
Pour l'utiliser, il convient tout d'abord de spécifier les en-têtes <algorithm> et <ostream> en début de source.
 
Dans mon programme, j'ai remplacé le type "int" par "Entier", une classe utilisateur implantant un entier long avec un "vector<char>".

Code :
  1. [...]
  2. class Entier
  3.   {
  4.   private: vector<char> vcCnt;
  5.   public:
  6.     Entier () { vcCnt.push_back ('0'); }
  7.     Entier (const Entier& e) : vcCnt (e.vcCnt) {}
  8.     Entier (long l) { vcCnt.push_back ('0'+l); } // entiers < 10
  9.     void Ecrire () { for (vector<char>::reverse_iterator i= vcCnt.rbegin (); i != vcCnt.rend (); i++) cout << *i; }
  10.     Entier& operator+= (Entier & );
  11.   };
  12. [...]
  13. void Afficher (vector<Entier> &veR)
  14.   {
  15.   cout << "<";
  16.   //for (vector<Entier>::iterator i= veR.begin (); i != veR.end (); i++) { cout << " "; i->Ecrire (); }
  17.   copy (veR.begin(), veR.end(), ostream_iterator<Entier> (cout, " " ));
  18.   cout << ">" << endl;
  19.   }
  20. [...]


J'ai le désagrément de constater que mon compilateur (g++ sous Kubuntu) a toutes les peines du monde à instancier cette classe ostream_iterator<Entier>.
 
Joel F, ta méthode est élégante, mais exigeante... en tout cas restreinte aux patrons de types prédéfinis.
 
EDIT : Je viens de m'apercevoir qu'il faut que je surcharge l'opérateur << pour utiliser copy(), entre autres...


Message édité par jxano le 29-06-2008 à 16:01:55
Reply

Marsh Posté le 29-06-2008 à 12:43:23   

Reply

Marsh Posté le 29-06-2008 à 17:51:19    

bah, c'est comme tout, tu lis la doc de la STL et tu auras la liste des concepts et interface que les types passable à copy exigent. C'est pas parce que tu n'arrive pas à la faire marcher que ca marche :o
Ensuite, sauf précision de ma part, les codes que je poste ne sont pas compilables (sauf ils commencent par un #include) mais représente un exemple de syntaxe. Le reste c'est dans la doc.

 

Enfin, operator<< est nécessaire pour ostream_iterator<> par pour copy qui lui ne demandent qu'un constructeur de copie et/ou un opérateur d'affectation.


Message édité par Joel F le 29-06-2008 à 17:52:50
Reply

Sujets relatifs:

Leave a Replay

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