C++ Funktionen

Zephiro

Cadet 2nd Year
Dabei seit
Mai 2009
Beiträge
19
Hi,

ich lerne gerade C++ und lese das Buch "C++ für Spieleprogrammierer".

Doch eins verstehe ich nicht ganz und deshalb frage ich euch :).

Code:
01: // C++ für Spieleprogrammierer
02: // Listing 4.4
03: // Funktionsparameter verwenden
04: //
05: #include <iostream>
06: 
07: using namespace std;
08: 
09: int berechnePunkte (int Punkte, int Restzeit, int Zeitfaktor);
10:
11: // Hauptprogramm
12: //
13: int main ()
14: {
15:	   // Variablen
16:	   //
17:	   int Gesamtpunkte = 0;   // Punkte, die insgesamt erreicht wurden
18:	   int Punkte = 0;         // Punkte bisher
19:	   int Restzeit = 0;       // Restzeit in Sekunden
20:	   int Zeitfaktor = 0;     // Punktebonus pro Sekunde
21:
22:	   // Abfragen der benötigten Werte
23:	   cout << "Wie viele Punkte wurden bisher erreicht: ";
24:	   cin >> Punkte;
25:
26:	   cout << "Restzeit in Sekunden: ";
27:	   cin >> Restzeit;
28:
29:	   cout << "Punktebonus pro Sekunde: ";
30:	   cin >> Zeitfaktor;
31:
32:	   // Gesamtpunkte durch Aufrufen der Funktion berechnen
33:	   Gesamtpunkte = berechnePunkte (Punkte, Restzeit, Zeitfaktor);
34:
35:	   // Gesamtpunkte anzeigen
36:	   cout << "\nInsgesamt wurden " << Gesamtpunkte;
37:	   cout << " Punkte erreicht! " << endl;
38:
39:      return 0;
40: }
41:
42: // berechnePunkte
43: //
44: int berechnePunkte (int Punkte, int Restzeit, int Zeitfaktor)
45: {
46:	   int Temp;   // Zwischenwert
47:
48:	   // Berechnung der Gesamtpunktzahl
49:	   Temp = Punkte + Restzeit * Zeitfaktor;
50:
51:	   // Rückgabe des Ergebnisses
52:	   return Temp;
53: }
Und zwar sind es diese Sätze (vorallem aber der 2.) :

Die eigentliche Funktion innerhalb der Zeilen 44 und 53 ist vom Ablauf her nicht sonderlich aufregend. Es wird einfach in Zeile 49 das Ergebnis berechnet und in Zeile 52 per return-Befehl zurückgegeben. Was hier (und im Prototyp in der Zeile) auffällt, ist die Tatsache, dass wir für den Rückgabewert nur den Datentyp angeben, für die Parameter allerdings Datentyp und einen Namen.
Warum wird bei den Parametern Datentyp + Name und beim Rückgabewert nur der Datentyp angegeben und wo sieht man das?

Schon mal DANKE im voraus.


Zephiro
 

powerfx

Admiral
Dabei seit
Apr. 2009
Beiträge
9.352
In Zeile 44 "int Punkte". Das ist Typ + Name.

In Zeile 52 "return Temp". Nur der Name.

Du kannst ja i.d.R. nur etwas zurückgeben (return), was schon bekannt ist. Temp ist es seit Zeile 46.
 

brown.bear

Cadet 3rd Year
Dabei seit
Jan. 2011
Beiträge
63
int (Rückgabewert mit Typ aber ohne Name)
berechnePunkte (Funktionsbezeichnung)
(int Punkte, (Parameter mit Typ und Name)
int Restzeit,
int Zeitfaktor)
 

Koksii

Banned
Dabei seit
März 2011
Beiträge
1.996
Naja beim Prototyping sagst du dem Compiler ja nur dass iwann ne Funktion auftaucht in die 3 int werte übergeben werden.

Später dann in der Funktion musste noch dazu schreiben wie die Variablen heißen ide von Main in die Funktion übergeben werden.

Und der wert den du returnest ist dann wieder oben in "int berechnePunkt" drin.
 
Zuletzt bearbeitet:

Zephiro

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Mai 2009
Beiträge
19
Ich weiß jetzt nicht ob ichs richtig verstanden habe.

Doch eins ist immer noch unklar: Da steht ja, dass nur der Datentyp angeben wird.

Aber bei "return Temp" wird ja der Name angegeben oder versteh ich das falsch?
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.139
Hinter return steht der Name der Variablen (oder ein Wert), die die Funktion zurück liefern soll. Du könntest auch direkt eine Zahl dahinter schreiben. Man kann die Funktion z.B. kompakter schreiben:
Code:
int berechnePunkte (int Punkte, int Restzeit, int Zeitfaktor)
{
	return Punkte + Restzeit * Zeitfaktor;
}
Für die Definition der Funktion ist also lediglich der Rückgabewert interessant. Wie dieser schlussendlich mit return zurückgeliefert wird ist egal.
Bei den Parametern brauchst du natürlich Namen, damit du diese auch voneinander unterscheiden kannst.
 

Hancock

Captain
Dabei seit
Nov. 2007
Beiträge
3.342
Die Sachen, die du Schreibst müssen dem Compiler ja was sagen:
I Deklaration
1. Name: Wie heißt die Funktion
2. Parametertypen: Was muss übergeben werden, Namen sind optional
3. Rückgabetyp: Was kommt zurück

II Definition
Alles wie bei I, aber nun muss man die Parameter auch ansprechen können->brauchen ein Namen.
Der Rückgabewert wird duch return implizit angegeben und brauch daher kein Name->kann keinen haben.

Nun kann man I und II zusammenfassen, dabei muss man natürlich alles notwendige mit angeben, also:
Rückgabetyp, Name der Funktion, Parameter mit Name und Typ.
Das in einem Schema und das sieht so aus:
Code:
Rückgabetyp Name ( Parametertyp1 Parametername1,Parametertyp2 Parametername2,...){
deine Funktion;
return Ergebnis;//Ergebnis muss von Typ Rückgabetyp sein
}
Beispiel:
Code:
int main(int argc,char *argv[]){
return 0;
}
ist äquivalent zu
Code:
int main(int,char*[]);
int main(int a,char*b[]){
return atoi("0");//atoi wandelt eine Zeichenfolge in eine Ganzzahl um: "0"->0
}
Der Name der Variable, die zurückgegeben wird, ist nur für den Compiler interessant, der muss ja von dir wissen, was zurückgegeben werden soll.
 

Koksii

Banned
Dabei seit
März 2011
Beiträge
1.996
wichtig is auch dass du nur einen wert pro funktion "returnen" kannst.

(Mit zeigern kann man durch den ganzen code schießen, aber das kommt erst später in dem buch und ist wesentlich komplizierter. Habs selbst nicht ganz verstanden um ehrlich zu sein. ^^)
 

Hancock

Captain
Dabei seit
Nov. 2007
Beiträge
3.342
@Koksii: Häää?
Du kannst nur einen Wert returnen, da die Funktion danach abbricht, aber du kannst natürlich dein return sooft einbauen, wie du willst.
Code:
int foo(int a){
switch(a){
case 0:return 1;
case 1:return 2;
case 2:return 7;
default:return 42;
}
}
Zeigern durch den Code schießen? Meinst du Call-By-Reference oder meinst du Funktionszeiger oder ein Longjmp oder ein goto, du scheinst es echt nicht verstanden zu haben :D
 

voodoo44

Lieutenant
Dabei seit
Apr. 2006
Beiträge
768
Blitzmerker - er hat es ziemlich unscharf ausgedrückt, aber:
auch deine Funktion gibt nur einen Wert zurück. Oder schaffst du es etwa, 2 Werte gleichzeitig zurückzugeben?
Du kannst hundert verschiedene "returns" einbauen - kriegst trotzdem nur EINEN Wert zurück, keine 4 (wie in deinem Beispiel).
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.139
Macht mal langsam. Koksii und Blitzmerker haben doch beide geschrieben, dass immer nur ein Wert zurückgeliefert werden kann. Das mehrere return-Anweisungen in einer Funktion möglich sind kam erst von Blitzmerker, ich kann aber auch hier nicht herauslesen, dass angeblich mehrere davon gleichzeitig aufgerufen werden können (was ja auch nicht geht).
 

Koksii

Banned
Dabei seit
März 2011
Beiträge
1.996
@Koksii: Häää?
Du kannst nur einen Wert returnen, da die Funktion danach abbricht, aber du kannst natürlich dein return sooft einbauen, wie du willst.
Code:
int foo(int a){
switch(a){
case 0:return 1;
case 1:return 2;
case 2:return 7;
default:return 42;
}
}
Zeigern durch den Code schießen? Meinst du Call-By-Reference oder meinst du Funktionszeiger oder ein Longjmp oder ein goto, du scheinst es echt nicht verstanden zu haben :D
Bei dir wird auch nur 1 Wert weitergegeben und zwar je nach Fall oder halt 42 wenn kein Fall zutrifft. :rolleyes: oder zeig mir ma wie du mehr als einen Wert in einer Funktion zurückgibst...
 

GuyIncognito

Commander
Dabei seit
Nov. 2009
Beiträge
2.379
oder zeig mir ma wie du mehr als einen Wert in einer Funktion zurückgibst...
Mit return kannst du in der Tat wirklich nur einen Wert aus der Funktion zurückgeben. Du wirst aber später extensiv von der Möglichkeit Gebrauch machen, Variablen per Referenz in die Funktion zu übergeben. Dann kannst du nämlich in der Funktion damit Schabernack treiben und die geänderten Werte später in deinem Programm weiter verwenden.
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
@Koksii: Häää?
Du kannst nur einen Wert returnen, da die Funktion danach abbricht, aber du kannst natürlich dein return sooft einbauen, wie du willst.
Dir ist schon klar, daß ihr zwei hier vollkommen aneinander vorbei diskutiert, ja? Was Koksii meinte, ist daß eine Funktion nur ein Ding (was immer dieses "Ding" sein mag) zurückgeben kann, nicht daß das "Ding" immer den gleichen Wert haben muß.
 

Hancock

Captain
Dabei seit
Nov. 2007
Beiträge
3.342
Jetzt ist mir das klar :)
Ich wollte halt hervorheben, dass man mehr als ein return schreiben darf. (Auch wenn das erste, welches erreicht wird, die Funktion dann beendet...)

Mir war der Text von Koksii in den Klammern etwas "verwirrend".

Es gibt halt auch den Programmierstil (Linux Kernel), bei dem man das return immer am Ende verwendet und sonst halt mit einem goto dahinspringt, wenn man mal Mittendrin abbrechen will, dadurch soll die Lesbarkeit und das Nachvollziehen des Codes vereinfacht werden, da "oben rein unten raus".
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Es gibt halt auch den Programmierstil (Linux Kernel), bei dem man das return immer am Ende verwendet und sonst halt mit einem goto dahinspringt, wenn man mal Mittendrin abbrechen will, dadurch soll die Lesbarkeit und das Nachvollziehen des Codes vereinfacht werden, da "oben rein unten raus".
Ok, der Kernel ist in C geschrieben, von daher ist das in Ordnung ... aber wenn ich diesen Single-Entry-Single-Exit-Stil in C++ sehe, läuft's mir kalt den Rücken runter. ;)
 

Daaron

Fleet Admiral
Dabei seit
Dez. 2011
Beiträge
13.487
Jep, wir PHP'ler habens leicht. Keine Typenbindung, Parameter sind eh immer optional (man kann auch mal 3 übergeben, obwohl die Funktion nur 2 will), unsere Funktionen geben zurück, was uns gefällt und unsere Variablen müssen wir nicht einmal deklarieren.
 
G

geisterfahrer

Gast
Kann man in C++ kein Array bzw. Objekt zurückgeben?
Selbstverständlich kann man das. Zusätzlich kann man wenn man Variablen unterschiedlichen Typs zurückgeben will (also Array wäre zumindestens in C++ nicht möglich), bei bspw. Template Klassen wie std::pair bedienen. Wenn man ein Float und ein int zurückgeben will, sähe das dann eben wie folgt aus: return std::pair<float, int>(floatvariable, intvariable); Rein technisch wird ja aber weiterhin nur eine Variable übergeben, eben eine Instanz der Klasse std::pair. In C++11 gibt's auch eine Tupel Variante, bei der man beliebig viele unterschiedliche Variablentypen speichern kann. Keine Sorge, insbesondere jetzt mit C++11 lebt es sich in der C++ sehr komfortabel.
 
Top