pb C++, pour utilisation des references - Programmation
TomsGuide.com : 700 000 inscrits répondent à toutes vos questions high-tech et informatique.
Pour obtenir de l'aide, inscrivez-vous gratuitement !
 




Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : pb C++, pour utilisation des references
 
Profil : IDNaute
Plus d'informations

Bonjour à tous,
J'utilise Dev C++, et j'ai un souci concernant mon programme avec la notion de reference...

mon fichier fonction:

void echange_references(int& w,int& z){

int k;
int j;
k=w;
j=z;

z=k;
w=j;

//Affichage valeurs:
cout<<"Avec la fonction echange references:"<<endl;
cout<<"La nouvelle valeur de a est: "<<j<<endl;
cout<<"La nouvelle valeur de b est: "<<k<<endl;

}


Mon main:

int a;
a=0;
int b;
b=0;


//Entrer valeurs:
cout<<"Veuillez rentrer la valeur de a et de b: ";
cin>>a>>b;

//Affichage valeurs:
cout<<"La valeur de a est: "<<a<<endl;
cout<<"La valeur de b est: "<<b<<endl;

//Appel à la fonction échange par references:
echange_references(a,b);


Entre les deux fichiers un fichier en .h:

void echange_references(int& ,int& );

Voila, donc en faites ce programme est tiré d'un exercice ou l'on doit créer trois fonctions, une par pointeur, une par valeurs et une par references, pour inverser la valeur de a et celle de b.
Pb: Par reference, les valeurs ne s'inverse pas!

Merci pr votre aide.

Liens sponsorisés


Inscrivez-vous ou connectez-vous pour masquer ceci.

Profil : IDNaute
Plus d'informations

Citation :


cout<<"Avec la fonction echange references:"<<endl;
cout<<"La nouvelle valeur de a est: "<<j<<endl;
cout<<"La nouvelle valeur de b est: "<<k<<endl;



J'aurais remplacé j et k par w et z...sinon j'ai l'impression que ta fonction inverse toujours a et b (enfin la phrase à l'ecran)...étant donné qu'elle renvoie la valeur d'une variable locale...

Pour tester cela j'aurais juste fait un appel de fonction et j'aurais ajouté dans le main :
cout<<a
cout<<b

En principe ca roue tout seul ça ??? non ?

Profil : IDNaute
Plus d'informations

Si je change j et k par w et z, qu'est que je vais mettre dans ma fonction comme parametre?
Dans mon main j'ai deja a et b qui passe dans la fonction et ensuite j'inverse a et b qui valent w et z dans ma fonction par reference.

Le plus etrange la dedans, est que j'ai déja fait cette fonction par valeurs et par pointeurs...et ca marché nikel.
Et quand par exemple je transforme cette fonction par reference en en valeurs comme fait précedement...et bien ca ne marche pas!!! curieux pourtant c la meme chose mai avec un nom de fonction different ou des arguments differents....

Profil : IDNaute
Plus d'informations

salut,
c'est un peu se torturer l'esprit pour un truc tout simple (tu pouvais rajouter 2 autres noms de variable, ca aurait été plus claire :p)
mais ton prog marche, c'est quoi le problème?


Message édité par coca25 le 29-10-2007 Ã  18:46:56

---------------
Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Profil : IDNaute
Plus d'informations

Et bien moi il ne marche pas!!!! lol
dev c++ me joue des tour pendart...c'est pas la premiere fois.
La derniere fois s'était sur un exo ou il fallait compter les voyelles d'une chaine de caractères rentrer par l'utilisateur! et bien crois moi, crois moi pas, mais tout va bien pour les voyelles a e i o y mais alors pour le u!!! niette keudal...il me fait tout beuguer!!
Bn mais si ma fonction en ref marche....je verrais ca sur un linux je crois.

Profil : IDNaute
Plus d'informations

je veux bien te croire, mais la machine ne fait que ce qu'on lui demande (pour la majorité des cas en tout cas)

tu peux peut etre expliquer ce que te fais ton programme (enfin ce qui ne marche pas)?

et expliquer pourquoi il y a un cout à l'intérieur de la fonction, le but étant de montrer l'echange après la fonction.


---------------
Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Profil : IDNaute
Plus d'informations

Citation :

je veux bien te croire, mais la machine ne fait que ce qu'on lui demande (pour la majorité des cas en tout cas)


Je ne le sais que trop bien....

J'ai modifié un peu mon programme avec le cout en dehors des fonctions: voila le fichier fonctions:

#include <cstdlib>
#include <iostream>

using namespace std;

void echange_valeurs(int x,int y){

int k;
int j;
k=x;
j=y;

x=j;
y=k;

}

void echange_adresses(int* x,int* y){

int k,j;
k=*x;
j=*y;

*x=j;
*y=k;

}

void echange_references(int& x,int& y){

int k;
int j;
k=x;
j=y;

x=j;
y=k;

}


Voila le main:

#include <cstdlib>
#include <iostream>
#include "biblio2.h"
using namespace std;

int main(int argc, char *argv[])
{

int a;
a=0;
int b;
b=0;


//Entrer valeurs:
cout<<"Veuillez rentrer la valeur de a et de b: ";
cin>>a>>b;

//Affichage valeurs:
cout<<"La valeur de a est: "<<a<<endl;
cout<<"La valeur de b est: "<<b<<endl;

cout<<endl;

//Appel à la fonction échange par valeurs:
echange_valeurs(a,b);

cout<<endl;

cout<<"La nouvelle valeur de a est: "<<a<<endl;
cout<<"La nouvelle valeur de b est: "<<b<<endl;

//Appel à la fonction échange par adresses:
echange_adresses(&a,&b); //On passe les adresses de a et b à la fonction.

cout<<endl;

cout<<"La nouvelle valeur de a est: "<<a<<endl;
cout<<"La nouvelle valeur de b est: "<<b<<endl;

//Appel à la fonction échange par references:
echange_references(a,b);

cout<<endl;

cout<<"La nouvelle valeur de a est: "<<a<<endl;
cout<<"La nouvelle valeur de b est: "<<b<<endl;


system("PAUSE" );
return EXIT_SUCCESS;
}


et le biblio.h:

void echange_valeurs(int ,int );
void echange_adresses(int*,int*);
void echange_references(int& ,int& );


Donc au final, les resultats à l'ecran sont:
si je rentre a=45 et b=70:

j'aurais pour echange_valeurs: a=45 et b=70;
echange_adresses: a=70 et b=45;
echange_ref: a=45 et b=70;

Soit deux sur les toris qui ne fonctionnent pas!!! je dois vraiment faire une erreur de foufou la! merci.

Profil : IDNaute
Plus d'informations

Bon déja je viens de comprendre pourquoi ca marchait en pointeur et non en valeurs!
Vu que dans une fonction normal, les valeurs modifiés ne se refletent en aucun cas dans le main!
Mais après comment faire...je planche encore! lol

Profil : IDNaute
Plus d'informations

nico27027, parfois c'est tout bête, tellement gros qu'on le voit pas :)

Quand tu fais appel à echange_references(), a et b sont inversés avant l'appel (car tu avais appelé echange_adresses() avant). Donc, tu échanges à nouveau les valeurs.
2 échanges successifs font revenir à la position initiale. Ce qui montre que ton code marche. ;)
Redemande a et b avant chaque appel de fonction, ou réinitialise a et b par les valeurs initiales (que tu auras donc mémorisé dans d'autres variables).


---------------
6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Profil : IDNaute
Plus d'informations

Non, puisque le premier ne marche meme pas!, l'echange par valeurs ne marche pas!

Profil : IDNaute
Plus d'informations

Sinon, pour info (ouais, parce que certains profs et auteurs de bouquins sont limités dans la connaissance du code généré à la compilation :) ), la référence et le pointeur se compilent de la même façon : c'est toujours l'adresse qui est donnée en paramètre, sauf qu'avec la référence, on a l'illusion de manipuler la variable (ça simplifie l'écriture en fait).

Lors d'un passage par valeur, c'est la valeur qui est posée sur la pile (en copiant la valeur sur la pile). La fonction utilise cette valeur. Elle utilise donc une adresse temporaire sur la pile. Temporaire, car le paramètre sera dépilé en fin de fonction.
Pour un passage par pointeur ou référence, c'est l'adresse de la variable qui est posée sur la pile (en copiant l'adresse qui pointe vers la zone mémoire contenant la valeur d'origine).

En C++, la référence, c'est en fait de la manipulation de pointeur qui se cache derrière la manipulation de valeur référencée.


---------------
6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Profil : IDNaute
Plus d'informations

nico27027 a écrit :

Non, puisque le premier ne marche meme pas!, l'echange par valeurs ne marche pas!


Le premier ne marche pas.
Le second marche.
Le troisième marche.

 

résultat:
début: a=1 b=2
1. rien: a=1 b=2
2. inversion: a=2 b=1
3. re-inversion: a=1 b=2

 

tu ne vois toujours pas ?


Message édité par CRicky le 29-10-2007 Ã  20:56:02

---------------
6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Profil : IDNaute
Plus d'informations

Le premier ne marche pas....c normal alors?
C'est normal parce que justement les valeurs modifiés dans la fonction ne le reste que dans la fonction?

Profil : IDNaute
Plus d'informations

déjà qu'il a du mal avec le but de l'exercice, va l'embrouiller avec les piles et le code généré :D

 

EDIT: oui nico27027, c'est normal


Message édité par coca25 le 29-10-2007 Ã  21:01:11

---------------
Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Profil : IDNaute
Plus d'informations