Avatar billede casperrindom Nybegynder
02. maj 2003 - 13:50 Der er 13 kommentarer

returnering af flere variable

Hejsa!
Hvordan returnerer jeg 2 variable?
Der er vist noget der hedder ambers and (&) eller hvad??

Please hjælp en newbie?

Mange tak
Avatar billede jpk Nybegynder
02. maj 2003 - 13:52 #1
Du kan ikke egentlig returnere flere variable, men du kan:

1) Give metoden pointere til parametrene med og lade den modificere dem
eller
2) Lave en klasse/struct med 2 members og returnere en sådan
Avatar billede jpk Nybegynder
02. maj 2003 - 13:54 #2
Et eksempel på 1)

int a, b;
MinMetode(&a, &b);

void MinMetode(int* pFirst, int* pSecond)
{
  *pFirst = 2*3;
  *pSecond = 3*4;
}
Avatar billede casperrindom Nybegynder
02. maj 2003 - 13:54 #3
Kan du evt. forklare mig hvorledes jeg udfører din mulighed nr 1.?
Avatar billede arne_v Ekspert
02. maj 2003 - 13:55 #4
& (ampersand) er jpk's #1.

void foobar(int *a, int *b)
{
  a = 1;
  b = 2;
  return;
}

int aa,bb;
foobar(&aa,&bb);
Avatar billede casperrindom Nybegynder
02. maj 2003 - 13:55 #5
mange tak:-)
Avatar billede gumbert Nybegynder
02. maj 2003 - 14:21 #6
der er jo oss refarencer
Avatar billede olennert Nybegynder
02. maj 2003 - 14:54 #7
gumbert har ret. Det kan være det casperrindom referer til. Så bliver arnes eksempel til:

void foobar(int& a, int& b) {
  a = 1;
  b = 2;
  return;
}

int aa, bb;
foobar(aa, bb);

Og så er der i øvrigt en (sjælden, Arne er nemlig bare rå) fejl i Arnes foobar. Eftersom a og b er pointere skal de derefereres:

void foobar(int* a, int* b) {
  *a = 1;
  *b = 1;
  return;
}
Avatar billede olennert Nybegynder
02. maj 2003 - 14:58 #8
Og så kan man tage STL til hjælp:

#include <utility>
using std::pair;
typedef std::pair<int, int> PairOfInts;
PairOfInts foobar() {
  PairOfInts retval = make_pair(1, 2);
  return retval;
}

PairOfInts my_pair = foobar();
// Her kan man så refere til my_pair.first (som er lig med 1),
// eller my_pair.second (som er lig med 2).

For en mere generel løsning end pairs (altså, en løsning hvor du kan returnere mere end to svar), så kan du kigge på www.boost.org efter tuples.
Avatar billede arne_v Ekspert
02. maj 2003 - 15:10 #9
oops.

pinlig en.
Avatar billede segmose Nybegynder
02. maj 2003 - 16:02 #10
olennert, hvor mange c'tor / d'tor / cc'tor (hedder det det???) er det lige der bliver kaldt i dit exemple?
6, 8, 10?

Hvis det ikke er nødvendigt så brug endelig refs.
Avatar billede olennert Nybegynder
02. maj 2003 - 22:02 #11
"Premature optimization is the root of all evil". Jeg tror det er et spørgsmål om præference her.

Personligt mener jeg, at hvis performance bliver et problem, så kan man gå ind og optimere. Lige præcis referencer kan være løsningen her, forudsat det er enkeltrådet kode. Ellers er der forskellige andre tricks man kan smide ind. Men der er efter min mening ikke i sig selv noget problem i værdi-overførte parametre, på trods af overhead med diverse c'tor/d'tor (både default- og copy-c'tor er generelt c'tor).

Hvis du har en indre løkke, så kan det blive for dyrt. Men i "almindelig" kode plejer det ikke at være et problem.

Når jeg koder så prøver jeg at kode noget der kan læses og forstås senere. Og når jeg så har kodet noget der er for langsomt, så  må jeg ind og optimere bagefter. Optimeringen gør så gerne en del af koden lidt mere uoverskuelig, men så må jeg ind og skrive lidt flere kommentarer.

Som sagt, et spørgsmål om hvad man foretrækker.
Avatar billede olennert Nybegynder
02. maj 2003 - 22:03 #12
Vedr. mit eksempel med std::pair: Jeg mangler også en using std::make_pair.
Avatar billede olennert Nybegynder
08. maj 2003 - 10:17 #13
casperrindom> Lukketid? Point til jpk?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester