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

15.08.2008, 14:50

[Erledigt] Frage zum Rückgabetyp/wert

Hallo liebe Communty :)

Ich habe mir vor ungefähr zwei Wochen das Buch C++ für Spieleprogrammierer gekauft, und bin sehr zufrieden damit. Bis jetzt habe ich eigentlich alles mehr oder weniger verstanden, doch beim Abschnitt 4.2.1 kam bei mir eine Frage auf, und zwar:
Wofür genau soll dieser ''Rückgabetyp/wert'' (return) sein? Ich weiss, das man mit ihm einen Wert zurückliefert, doch ich verstehe den Sinn davon nicht ganz. Was passiert mit diesem Wert, den man zurückliefert, wie zum Beispiel die 0 bei:

C-/C++-Quelltext

1
2
3
4
5
6
int main ()
{
     // Programm


    return 0;
}


Ich begreife einfach nicht, warum man einen Wert zurückliefern soll bei einer Funktion, und was dann eigentlich mit diesem Wert passiert.
Hoffentlich kann mir jemand helfen, ich wäre wirklich dankbar dafür :)
Vielen Dank.

mfg DamDam

Anonymous

unregistriert

2

15.08.2008, 14:55

Denk an Mathe:

Quellcode

1
y = (f(x) = x*2 + 1)


das ist in C++:

C-/C++-Quelltext

1
2
3
4
5
6
int f (int x)
{
    return x*2 + 1;
}

int y = f (irgendein wert);


Mit y kannst du nun arbeiten ;)

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

3

15.08.2008, 15:57

Oder etwas Programmiernäher (Sorry für das Wort): Wenn du einen Funktionsteil hast, der nur dazu dient einen einzigen Wert oder eine einzige Information zu berechnen, kannst du diese Berechnung in eine eigene Funktion extrahieren und den Rückgabewert benutzen.

Anstatt Beispielsweise:

C-/C++-Quelltext

1
2
3
4
5
6
void incomingNode(Node* n) {
 if (lastNode == null || getTimestamp(n) < getTimestamp(lastNode)) {
  lastNode = n;
  parseNode(n);
 }
}


Kannst man etwas refactoring betreiben um das ganze etwas leserlicher zu machen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
bool lastNodeIsOutdated(Node* newNode) {
 if (lastNode == null || getTimestamp(n) < getTimestamp(lastNode)) {
  lastNode = n;
  return true;
 }
 return false;
}

void incomingNode(Node* n) {
 if (lastNodeIsOutdated(n)) {
  parseNode(n);
 }
}


Du kannst also dein Programm in kleinere Teile/ Funktionen zerlegen. Das ist übersichtlicher, erhöht die Wiederverwendbarkeit einzelner Programmteile und macht die Fehlersuche einfacher.

Du kannst also Funktionen ohne Rückgabewert einsetzen (sog. Prozeduren). Die machen dann irgendeinen Job für dich. Mit Rückgabewerten kannst du dir aber einfach noch ein Resultat des Jobs zurückliefern lassen und diesen ohne große Umschweife in deinem Programm wiederverwerten.

4

15.08.2008, 16:44

Hallo :)

Vielen Dank schonmal für die beiden Antworten :)
Allerdings bin ich noch nicht richtig weiter gekommen mit den Antworten, da ich unter anderem die Quelltexte von p0llux (noch) nicht so ganz verstehe.
So wie ich das verstanden habe ist der Rückgabewert dazu da, um zu schauen, ob die Funktion korrekt ausgeführt wurde, stimmt das?
Wenn ja, ist mir immer noch nicht ganz klar wie ich dass dann überprüfen kann, da ich ja einen Wert hinschreibe, und nicht einen von der Funktion ''erhalte''.
Hoffentlich versteht ihr was ich meine :?

Falls nicht, hier nochmal meine allgemeine Frage:
Wozu muss ich einen Wert zurückgeben bei einer Funktion (Abgesehen von den void Funktionen, da wird dies ja soweit ich weiss nicht benötigt) ?

Hoffentlich kann mir jemand helfen, und ich entschuldigung mich dass ich zweimal Nachfragen muss, das ganze ist gerade ziemlich verwirrend für mich :)
Vielen Dank.

mfg DamDam

Viktor

Alter Hase

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

5

15.08.2008, 17:32

Rückgabewert:

Wenn du in deinem Programm 200 mal berechnen willst, was z.B.
f(x) = (x-y)*5/x
ist, dann wäre es umstnändlich, jedesmal:

C-/C++-Quelltext

1
2
3
4
int x,y;
cin >> x;
cin >> y;
cout << "...Es kommt :" << (x-y)*5/x << " heraus" << endl;

zu schreiben.
Daher verwendest du die Funktion (ich nenne sie jetzt einfach mal func)

C-/C++-Quelltext

1
2
3
4
float func(int x, int y)
{
   return (x-y)*5/x;
}


So kannst du jetzt immer schreiben:

C-/C++-Quelltext

1
2
3
4
int x,y;
cin >> x;
cin >> y;
cout << "...Es kommt :" << func(x,y) << " heraus" << endl;

schreiben. Wenn du jedesmal auch immer das x und y einlesen willst, kannst du dieses selbsverständlich auch in die funktion mit reinnehmen...

Auf der anderen Seite kannst du den Rückgabewert auch zum fehlerfinden benutzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
int func()
{
   int a,b;
   cin >> a;
   cin >> b;
   if(a == 0 || b==0)
    return 0;
   return a/b;
}


dann fragst du in der main ab:

C-/C++-Quelltext

1
2
3
4
int buffer;
if(0 == buffer=func())
  return 1; // es trat ein fehler auf,d.h. a oder b waren 0

// andernfalls wird ganz normal weitergemacht


Beispiel ist jetzt etwas blöd gewählt, aber im Grunde genommen kann man das so machen (wobei es später auch noch try - catch gibt....)

6

15.08.2008, 21:34

ich versuch es auch mal es zu verdeutlichen:
beispiel:

du willst dir eine klasse schreiben die dir die arbeit mit +, -, * und / abnimmt kapselst du die in eine klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class CMathe
{
public:
int addition(int a, int b);
int subtraktion(int a, int b);
int multiplikation(int a, int b);
int division(int a, int b);
};


jetzt die eigentliche klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int CMathe::addition(int a, int b)
{
   return a + b;
}

int CMathe::subtraktion(int a, int b)
{
   return a - b;
}

int CMathe::multiplikation(int a, int b)
{
   return a * b;
}

int CMathe::division(int a, int b)
{
   return a / b;
}


jetzt das hauptprogramm:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "deine_matheklasse.h"

CMathe Mathe;

int main()
{
    int addition = Mathe.addition(50, 50);
    std::cout << addition;
    std::cin.get();
    return 0;
}


der rückgabewert der funktion addition ist 100, da wir der funktion ja 50 und 50 übergeben. in der console würde als ausgabe dann später 100 stehen.
ich hoffe das ist verständlich dargestellt

Viktor

Alter Hase

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

7

15.08.2008, 22:05

Zitat von »"Bolle"«

ich versuch es auch mal es zu verdeutlichen:


Ich glaube, wenn er das mit dem Rückgabetyp nicht verstanden hat, dann wird er mit Klassen auch noch nicht viel anfangen können...

8

16.08.2008, 01:13

Hallo liebe Community

Super, vielen vielen Dank dass ihr euch so viel Mühe gebt um mir zu helfen :)
Ich glaube, langsam kommt Licht ins Dunkle.
Eine Frage hätte ich aber noch:
Ist das richtig dass man so zu sagen Werte an die Funktion zurück gibt mit diesem return? Also dass die von mir gestellte Rechnung in der Funktion z.B

C-/C++-Quelltext

1
return a + b;


dann an die Funktion weitergeleitet wird, so dass wenn ich die Funktion aufrufe dann das Ergebnis von a + b ausgegeben wird?
Vielen Dank schonmal.

mfg DamDam

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

16.08.2008, 01:17

Nein, nicht an die Funktion, sondern von der Funktion.
Die Funktion berechnet z.B. etwas und gibt das Ergebnis "an das Programm" zurück, damit es weiter verwendet werden kann.

Lord-archimedes

Treue Seele

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

10

16.08.2008, 09:10

Hallo DamDam noch ein Tipp von mir:

Oftmals ist der Rückgabewert bei der main Funktion unnötig und sie benötigt auch seltener einen Integerwert.
Also schreibe am besten als main () Block:

C-/C++-Quelltext

1
2
3
4
5
void main(void)
{
  // deine Anweisungen

  // die return-zeile fällt hier weg

}


Gruß Lord-archimedes

Werbeanzeige