Se connecter / S'enregistrer
Votre question

pb C++, pour utilisation des references

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
29 Octobre 2007 17:10:48

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

29 Octobre 2007 17:35:22

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 ?
29 Octobre 2007 18:38:32

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....
Contenus similaires
29 Octobre 2007 18:46:38

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?
29 Octobre 2007 19:06:12

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.
29 Octobre 2007 19:21:34

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.
29 Octobre 2007 19:55:11

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.
29 Octobre 2007 20:34:57

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
a b L Programmation
29 Octobre 2007 20:39:52

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).
29 Octobre 2007 20:45:33

Non, puisque le premier ne marche meme pas!, l'echange par valeurs ne marche pas!
a b L Programmation
29 Octobre 2007 20:52:05

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.
a b L Programmation
29 Octobre 2007 20:54:48

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 ?
29 Octobre 2007 20:59:51

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?
29 Octobre 2007 21:00:35

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
29 Octobre 2007 21:02:11

J'ai pigé pr les pointeurs et references!!! merci!
29 Octobre 2007 21:03:51

LOL! non mais l'histoire des piles et tout le bordel j'ai bien compris..m'en faites j'ai du mal a decoder un programme...ca me fait chier svt!
5 ans que je fais du c, c++, assembleur...et ca me gave!
29 Octobre 2007 21:09:29

au bout de 5 ans, si tu y arrives toujours pas, je veux pas dire, mais bon, c'est pas ce qui se fait de plus compliqué (pour rester sympa :p )
29 Octobre 2007 21:23:26

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!
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS