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

  FORUM HardWare.fr
  Programmation
  C++

  passage par référence

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

passage par référence

n°1744037
lordankou
Posté le 10-06-2008 à 10:58:19  profilanswer
 

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

mood
Publicité
Posté le 10-06-2008 à 10:58:19  profilanswer
 

n°1744065
jxano
Le 'x' est muet
Posté le 10-06-2008 à 11:20:18  profilanswer
 

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.

n°1744070
lordankou
Posté le 10-06-2008 à 11:25:02  profilanswer
 

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

n°1744108
lordankou
Posté le 10-06-2008 à 11:51:21  profilanswer
 

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.

n°1744131
kyntriad
Posté le 10-06-2008 à 12:09:09  profilanswer
 

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
n°1744144
lordankou
Posté le 10-06-2008 à 12:23:46  profilanswer
 

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:

n°1744148
jxano
Le 'x' est muet
Posté le 10-06-2008 à 12:28:27  profilanswer
 

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


n°1744154
lordankou
Posté le 10-06-2008 à 12:40:48  profilanswer
 

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

n°1744294
Joel F
Real men use unique_ptr
Posté le 10-06-2008 à 16:24:38  profilanswer
 

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 ?

n°1752940
jxano
Le 'x' est muet
Posté le 29-06-2008 à 12:43:23  profilanswer
 

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
mood
Publicité
Posté le 29-06-2008 à 12:43:23  profilanswer
 

n°1753041
Joel F
Real men use unique_ptr
Posté le 29-06-2008 à 17:51:19  profilanswer
 

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

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

  passage par référence

 

Sujets relatifs
passage de l'intérieur d'un tableau par référence dans une fonction ?[C --> C++] passage par référence
Passage par référencepassage par reference ommissible
fonction avec passage par reference de variableQuestion tout bête de passage par référence
passage par référence pour objets php [OK][VBA] Le passage de parametre par référence ne marche pas???
[c++] Passage par référence d'un vector <>Passage par valeur ou par reference???
Plus de sujets relatifs à : passage par référence


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