Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.02.2011, 23:40

Verschachtelte Funktionen und Rückgabewert

Hallo liebe Community,

ich arbeite gerade das Buch C++ für Spieleprogrammierer durch und hänge im Kapitel Funktionen. Dort steht, man kann auch Funktionen verschachteln. So weit so gut. Mit Funktionen, die keinen Rückgabewert verlangen geht so weit alles gut. Jetzt möchte ich aber gerne in den Funktionen rechnen und einen Integer zurückgeben. In der main Funktion soll die aufgerufene Funktion1 einen Wert 'Gesamt' zurückgeben. Die aufgerufene Funktion1 wiederum soll eine Funktion2 aufrufen, in der die Punkte eingegeben werden und der eingegebene Wert zurückgegeben wird. Hier erstmal der Quelltext:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>

using namespace std;


int Funktion1();//Vorwärtsdeklaration
int Funktion2();//Vorwärtsdeklaration


int main ()
{
    int Gesamt;

    Gesamt = Funktion1 ();//rufe Funktion 1 auf und gebe Wert zurück

    cout << "Punkte insgesamt: " << Gesamt << endl;//gib Gesamtpunkte aus nachdem Funktionen abgearbeitet

    return 0;
}


int Funktion1 ()
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    Funktion2();
    return Funktion2 ();
}



int Funktion2 ()
{
    cout << "Zweite Funktion wurde aufgerufen" << endl;
    int Punkte;
    cout << "Bitte Punkte eingeben: ";
    cin >> Punkte;
    return Punkte;
}


Wenn ich nun die Funktion1 habe:

C-/C++-Quelltext

1
2
3
4
5
6
int Funktion1 ()
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    Funktion2();
    return Funktion2();
}


... dann führt diese die Funktion2 aus und soll den Wert übernehmen, den Funktion2 zurückgegeben hat, also die eingegebene Zahl.

Wie kann ich das machen? Wie kann ich den Wert von Funktion2 an Funktion1 zurückgeben?

Wenn ich einfach schreibe:

C-/C++-Quelltext

1
2
3
4
5
int Funktion1 ()
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    return Funktion2();
}


...dann funktioniert das soweit und Funktion1 nimmt den Wert, den Funktion2 zurückgegeben hat.

Aber geht es auch anders, so dass ich erst die zweite Funktion aufrufe und dann über return einen Wert zurückgebe?

C-/C++-Quelltext

1
2
3
4
5
6
int Funktion1 ()
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    Funktion2();
    return ???;
}



Danke schon mal im Voraus...

2

26.02.2011, 00:02

C-/C++-Quelltext

1
2
3
4
5
6
int Funktion1 ()
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    int ergebnis = Funktion2();
    return ergebnis;
}


Einfach den Wert speichern ;)

3

26.02.2011, 09:38

Manchmal liegt die Antwort doch so Nahe... und man steht trotzdem auf dem Schlauch. :D

Vielen Dank.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

27.02.2011, 19:21

Hätte auch mit nem Pointer funktioniert.

meiner meinung nach sind die fälle in denen das sinnvoll ist sind sehr selten. in meinem größten programm mit ca. 50 klassen verwende ich es nur ein oder zwei mal. dabei ist das eindeutig einer der fälle in denen es nicht sinnvoll ist.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

27.02.2011, 20:14

Hätte auch mit nem Pointer funktioniert. Solange man aber nur einen Wert übergeben muss, kann man aber auch den Wert per return zurückgeben.

Ich hoffe stark, dass du hier einen Smart-Pointer meinst ;)

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

27.02.2011, 20:25

ich glaub er meints eher so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void Funktion1(int *wert);//Vorwärtsdeklaration
void Funktion2(int *wert);//Vorwärtsdeklaration

int main ()
{
    int Gesamt;

    Funktion1 (&Gesamt);//rufe Funktion 1 auf und gebe Wert zurück

    cout << "Punkte insgesamt: " << Gesamt << endl;//gib Gesamtpunkte aus nachdem Funktionen abgearbeitet

    return 0;
}


void Funktion1 (int *wert)
{
    cout << "Erste Funktion wurde aufgerufen" << endl;
    Funktion2 (wert);
}



void Funktion2 (int *wert)
{
    cout << "Zweite Funktion wurde aufgerufen" << endl;
    cout << "Bitte Punkte eingeben: ";
    cin >> *wert;
}


oder?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

7

27.02.2011, 21:04

Dann sollten (wir sind ja bei C++) Referenzen statt Zeiger verwendet werden, da hier immer ein Objekt übergeben werden muss.

Nichts desto trotz, empfinde ich Funktionen hier ansprechender.

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

27.02.2011, 21:39

mir ists lieber den benutzer klar zu machen, dass ich daten ändern könnte wenn er mir welche übergibt.
deshalb nehme ich in meinen funktionen nur referenzen auf const(wenn ich nur lesen will) oder zeiger(wenn ich das objekt bearbeite) an.

Nichts desto trotz, empfinde ich Funktionen hier ansprechender.

die aussage versteh ich jetzt nicht.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

27.02.2011, 22:48

mir ists lieber den benutzer klar zu machen, dass ich daten ändern könnte wenn er mir welche übergibt.
deshalb nehme ich in meinen funktionen nur referenzen auf const(wenn ich nur lesen will) oder zeiger(wenn ich das objekt bearbeite) an.

Nun, ob ein Objekt verändert werden kann, sollte primär an der Signatur der Funktion erkennbar sein. Hieran wird ja z. B. entschieden welche Methode eines Objektes aufgerufen wird (Stichwort: const-correctness).

Ein Zeiger sollte nur dann verwendet werden, wenn man auch "nichts" übergeben kann. Sprich: Null-Pointer. Kann nicht "nichts" übergeben werden, sollte immer die Referenz gewählt werden (wie im vorgenannten Fall).

C-/C++-Quelltext

1
2
3
4
5
void view(const T& bar); 
void manipulate(T& bar); 
void view(const T* bar); // Wobei auch "nichts" betrachtet werden kann. 
void manipulate(T* bar); // Wobei auch "nichts" manipuliert werden kann. 
// -> Fehlerbehandlung.


Zitat von »bwbg« Nichts desto trotz, empfinde ich Funktionen hier ansprechender.
die aussage versteh ich jetzt nicht.

Sorry, hier habe ich auch die halbe Aussage vergessen -> Funktionen mit Rückgabewert und konstanten Parametern.

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

27.02.2011, 23:37

Meistens ist es viel praktischer, den Wert, den eine reine Get-Funktion liefern soll, mittels return und ganz ohne Referenzen/Zeiger zu übergeben, so läuft man auch nicht Gefahr, dass NULL übergeben wird, wenn es eigentlich nicht erlaubt ist. Beispiel:

int x = MyList[xyz->GetIndex()];

In den meisten Fällen wird nur ein Parameter zurückgegeben.

Werbeanzeige