webForumDet fria alternativet

Nybörjarfråga

10 svar · 440 visningar · startad av tosses

tossesMedlem sedan aug. 2003190 inlägg
#1

Hej!

Hur gör man för att ta med sig ett värde från en funktion tillbaka till main och stoppa in värdet i nästa funktion?

ex:

funkt1(int tal1)
{
tal1 += 3;
return tal1 tillbaka till main typ?
}

funktion2(int tal2)
{
tal2 += 25;
}

main()
{
funkt1(12);
funkt2(tal1 från funktion1);
}

Ungefär.. Hoppas ni förstår hur jag menar!

ViktorMedlem sedan aug. 20021 752 inlägg
#2

Det finns flera sätt.
I detta exemple använder jag return funktionen för att retunera ett värde från funktionen till den anroppande funktionen,

int funkt1(int tal1)
{
	return(tal1+3);
}

int funktion2(int tal2)
{
	return(tal2+25);
}

int main(int argc, char** argv)
{
	int tal1=funkt1(12);
	int tal2=funkt2(tal1);
	cout << "Svaret bli: " << tal2 << endl;
	return(0);
}

/Viktor

tossesMedlem sedan aug. 2003190 inlägg
#3

Men om jag vill returnera 3 tal , tal1 tal2 tal3 från funktion1 som jag sen vill stoppa in i funktion2 där jag sen vill returnera 3 tal igen och stoppa in i funktion 3

void main()
{
inlasning();
sortering(3 tal från funktion inlasning);
bytplats(3 tal från funktion sortering);
utskrift(3 tal från funktion bytplats);
}

float inlasning()
{
float tal1=0,tal2=0,tal3=0;
cout<<"Ange 3 tal: ";
cin>>tal1>>tal2>>tal3;
return tal1,tal2,tal3;
}

void sortering(float stal1, float stal2, float stal3)
{
if(stal1 > stal2)
{
bytplats(stal1, stal2);
}
else if(stal2 > stal3)
{
bytplats(stal2, stal3);
}
}

void bytplats(float btal1, float btal2)
{
float temptal;
temptal = btal1;
btal1 = btal2;
btal2 = temptal;
}

void utskrift()
{
}

Marcus EMedlem sedan maj 20021 466 inlägg
#4

Byt ut float mot float&.

Då kommer det att skapas en referens till den variabel som skickas som argument. Det går endast i C++.

I C går det att göra på ett liknande sätt med * istället för &.

tossesMedlem sedan aug. 2003190 inlägg
#5

Men kan man returnera flera värden från en funktion??

PeWMedlem sedan juni 200010 432 inlägg
#6

tosses skrev:

Men kan man returnera flera värden från en funktion??

Nej. Men du kan modifiera vid anropet medskickade parametrar och du kan returnera en pekare till en datasamling som innehåller flera värden.

I C är det vanligt att man inte returnerar värdet utan en felkod. Värdena som ska modifieras sänds som pekare till adresserna de ligger på och i funktionen är det bara att pilla med dem så består resultatet när funktionen terminerat.

tossesMedlem sedan aug. 2003190 inlägg
#7

vad är det exat som händer här?? :

void sortering()
{
if(tal1 > tal2)
{
bytplats(tal1, tal2);
}
if(tal1 > tal3)
{
bytplats(tal1, tal3);

}
if(tal2 \> tal3)
{
	bytplats(tal2, tal3);
}

}

void bytplats(float& tal1, float& tal2) //
{
float temptal;
temptal = tal1;
tal1 = tal2;
tal2 = temptal;
}

alltså med float&

PeWMedlem sedan juni 200010 432 inlägg
#8

& är referenser, vilket innebär att du sänder adressen till variablerna tal1 och tal1, istället för en kopior av värdena för tal1 och tal2. Om det varit det senare hade kopiorna försvunnit när funktionen är klar, men genom att det är adresser du skickar så är det innehållet på just den adressen du bearbetar och därför är värdena då förändrade efter att funktionen är klar (iom att funktionen byter plats på dem). :)

FredrikFMedlem sedan maj 200391 inlägg
#9

PeW skrev:

& är referenser, vilket innebär att du sänder adressen till variablerna tal1 och tal1, istället för en kopior av värdena för tal1 och tal2.

Rätt men ändå lite diffust svarat.

& och & är olika saker. Dels betyder &-tecknet addressen till en pekare men det kan också betyda att man avser att skicka parametrar by reference till en funktion. Det är olika saker.

Sedan att referenser är slags pekare gör inte att man kan likställa de två betydelserna av &-tecknet.

PeWMedlem sedan juni 200010 432 inlägg
#10

Jo, men i grund och botten är det samma sak, även om det är dolt i ett mer eller mindre abstrakt lager. Det är fortfarande adressen som explicit skickas med och inte kopior av värdena på den adressen. Kändes inte meningsfullt att i denna tråd lägga upp en mer djupgående förklaring kring adresser, stackar och funktionsanrop.

forumMedlem sedan apr. 2003100 inlägg
#11

Jag vet precis vad ni menar, och håller med. Så är det!
Men jag undviker att tänka på det, jag har det bara i bakhuvudet.

Som människa, märker man inte så stor skillnad (nästan ingen)
Och det är ju det som är lite tanken med C++ och OOP:
'Tänk som den människa du är - och inte som en dator' :)

127 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)