OVH Cloud OVH Cloud

[newbie] fonctions avec deux valeurs en "return"

8 réponses
Avatar
PierreAd
Salut à tous !!!
bon, ma question paraitra certainement niaise pour la plupart d'entre vous,
j'espère cependant que quelqu'un aura la gentillesse de me répondre...

voila mon problème :
en fait, je crée une fonction, jusque là pas de problème...
seulement, cette fonction doit me retourne deux résultats différents, que je
voudrais ensuite utiliser dans le programme principal.....
mais voila, je ne sais pas comment faire, en fait, c'est pour ça que je me
demande si il est possible qu'une fonction retourne plus d'une variable....
et si oui, est ce qu'il y a une syntaxe spéciale ???

j'espère avoir été clair, mais j'en suis pas très sur... si vous avez besoin
de plus de précisions, dites le moi !!! :o)

Ciao !!!


PierreAd

--

http://www.geocities.com/c_moi_pierread/

8 réponses

Avatar
Vincent Richard

voila mon problème :
en fait, je crée une fonction, jusque là pas de problème...
seulement, cette fonction doit me retourne deux résultats différents, que
je voudrais ensuite utiliser dans le programme principal.....
mais voila, je ne sais pas comment faire, en fait, c'est pour ça que je me
demande si il est possible qu'une fonction retourne plus d'une
variable.... et si oui, est ce qu'il y a une syntaxe spéciale ???


Une fonction ne peut pas retourner plusieurs valeurs (enfin, pas
directement). Il existe plusieurs solutions pour contourner le "problème".

La première consiste à passer des paramètres par référence plutôt que par
valeur. Par exemple :

void fonction(int& x, int& y)
{
x = 123;
y = 456;
}

int a, b;
fonction(a, b);
// ici, a vaut 123 et b vaut 456

Une autre solution : créer un objet pour regrouper les 2 valeurs.

struct RetourFonction
{
int x;
int y;
};

RetourFonction fonction()
{
RetourFonction ret;

ret.x = 123;
ret.y = 456;

return ret;
}

RetourFonction s = fonction();
// s.x vaut 123 et s.y vaut 456


Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-

Avatar
PierreAd
Merci beaucoup d'avoir répondu aussi vite !!!! pour la deuxieme méthode,
j'en suis pas encore là, je l'ai dit, je suis un ptit nouveau dans le monde
du C++..... mais je suis moins nul qu'avant c'est déjà ça ;o)

PierreAd




le 27 Sep 2003 18:34:58,

Une fonction ne peut pas retourner plusieurs valeurs (enfin, pas
directement). Il existe plusieurs solutions pour contourner le "problème".

La première consiste à passer des paramètres par référence plutôt que par
valeur. Par exemple :

void fonction(int& x, int& y)
{
x = 123;
y = 456;
}

int a, b;
fonction(a, b);
// ici, a vaut 123 et b vaut 456

Une autre solution : créer un objet pour regrouper les 2 valeurs.

struct RetourFonction
{
int x;
int y;
};

RetourFonction fonction()
{
RetourFonction ret;

ret.x = 123;
ret.y = 456;

return ret;
}

RetourFonction s = fonction();
// s.x vaut 123 et s.y vaut 456


Vincent


Avatar
Christophe Lephay
"PierreAd" a écrit dans le message de
news:3f75ba95$0$27025$
voila mon problème :
en fait, je crée une fonction, jusque là pas de problème...
seulement, cette fonction doit me retourne deux résultats différents, que
je

voudrais ensuite utiliser dans le programme principal.....
mais voila, je ne sais pas comment faire, en fait, c'est pour ça que je me
demande si il est possible qu'une fonction retourne plus d'une
variable....

et si oui, est ce qu'il y a une syntaxe spéciale ???



si tu dois retourner deux int :

std::pair< int, int > fonction()
{
int x, y;
...
return std::pair< int, int > (x, y ); //(*)
}

(*)ou alors, plus simple :

return std::make_pair( x, y );

Tu utilises ensuite comme suit :


std::pair< int, int> truc = fonction();

int x, y;
x = truc.first;
y = truc.second;



std::pair et std::make_pair font partie de la bibliothèque standard. Si
c'est un peu long de se taper à chaque fois les std::pair<int, int>, tu peux
faire un typedef...

Chris

Avatar
Jonathan Mcdougall
voila mon problème :
en fait, je crée une fonction, jusque là pas de problème...
seulement, cette fonction doit me retourne deux résultats différents, que
je


Une fonction qui retourne deux valeurs différentes fait probablement deux
choses différentes. Sépare-la en deux.

Sinon, utilise les solutions déjà proposées.


Jonathan

Avatar
hackervalley
PierreAd wrote:
Salut à tous !!!
bon, ma question paraitra certainement niaise pour la plupart d'entre vous,
j'espère cependant que quelqu'un aura la gentillesse de me répondre...

voila mon problème :
en fait, je crée une fonction, jusque là pas de problème...
seulement, cette fonction doit me retourne deux résultats différents, que je
voudrais ensuite utiliser dans le programme principal.....
mais voila, je ne sais pas comment faire, en fait, c'est pour ça que je me
demande si il est possible qu'une fonction retourne plus d'une variable....
et si oui, est ce qu'il y a une syntaxe spéciale ???

j'espère avoir été clair, mais j'en suis pas très sur... si vous avez besoin
de plus de précisions, dites le moi !!! :o)

Ciao !!!


PierreAd

--

http://www.geocities.com/c_moi_pierread/




A tout hasard, je te propose de voir aussi les pointeurs de fonctions.
http://www.function-pointer.org/

Cela ne répond pas précisément à ta question, mais donne une autre piste
pour traiter ton problème.

Bonne chance .

hackervalley /* http://hackervalley.free.fr */

Avatar
Matt...
si tu dois retourner deux int :

std::pair< int, int > fonction()
{
int x, y;
...
return std::pair< int, int > (x, y ); //(*)
}

(*)ou alors, plus simple :

return std::make_pair( x, y );

Tu utilises ensuite comme suit :


std::pair< int, int> truc = fonction();

int x, y;
x = truc.first;
y = truc.second;



std::pair et std::make_pair font partie de la bibliothèque standard. Si
c'est un peu long de se taper à chaque fois les std::pair<int, int>, tu
peux

faire un typedef...

Chris

Bonsoir,


t'as pas plus compliqué ???

Matt...

Avatar
Michaël Monerau
Matt... wrote:
std::pair et std::make_pair font partie de la bibliothèque standard.
Si c'est un peu long de se taper à chaque fois les std::pair<int,
int>, tu peux faire un typedef...

Chris

t'as pas plus compliqué ???



Si, ne sous-estime pas le C++. On peut faire beaucoup plus compliqué que ça
!!

;-)

Nan, mais en vérité, ce n'est pas bien compliqué, il faut juste connaître
std::pair.
--
<=- Michaël "Cortex" Monerau -=>


Avatar
Christophe Lephay
"Matt..." a écrit dans le message de
news:3f771af4$0$20617$
std::pair et std::make_pair font partie de la bibliothèque standard. Si
c'est un peu long de se taper à chaque fois les std::pair<int, int>, tu
peux

faire un typedef...
t'as pas plus compliqué ???



S'il s'agit de retourner deux valeurs, il n'y a surtout pas de moyen de
faire plus simple. Dans tous les cas, tu es obligé de passer par une classe
ou structure pour renvoyer deux valeurs. Si tu connais std::pair (ce qui est
tout de même fortement conseillé), c'est plus lisible que de créer
spécialement une classe pour celà. C'est d'ailleurs la méthode utilisée par
la SL quand elle en a besoin.

Quand à l'alternative qui consiste à passer les paramètres via des
reférences pour pouvoir les modifier, je la trouve à la fois moins lisible
et moins robuste : moins lisible car ce n'est pas évident en lisant un appel
de fonction de savoir quels sont les paramètres qui seront modifiés, ce qui
peut induire des effets de bords imprévus (àa c'est pour la partie
robustesse).

Maintenant, vu que le besoin de retourner deux valeurs devrait être peu
fréquent, la relative complexité est plus que gérable...

Chris