Se connecter avec
S'enregistrer | Connectez-vous

pb C++, pour utilisation des references

Dernière réponse : dans Programmation

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.

Autres pages sur : utilisation references

Lassé par la pub ? Créez un compte

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 ?

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

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.

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.

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.
Expert Programmation

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).
Expert Programmation

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.
Expert Programmation

nico27027 a dit :
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 ?

Oui, enfin disons 3 ans en IUT (quelques heures)ou je foutais vraiment rien!!!! mais alors rien de chez rien!
1 an en licence (encore quelques heures)ou la j'ai deja un poil mieux bosser, mais bn c maintenant en master que je veux devenir optimum, pr simuler mes petites particules...lol!
J'y arriverais bien en bossant correctement!
Lassé par la pub ? Créez un compte
Tom's guide dans le monde