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

19.06.2007, 18:18

Bitte dringend um Hilfe < aka "Ich bin verwirrt&quot

Nun, ich befinde mich imo auf Seite 202.
Im Kapitel 7.7 zu Speicherreservierung heißt es: "Es wurde ja geklärt, dass lokale Variablen auf dem Stack erzeugt werden" :?: ich dachte bis dato, das Variablen oder Instanzen lediglich auf dem Stack erzeugt bzw. abgelegt werden wenn sie an eine Funktion (natürlich nur die Werte als temporäre Kopie) übergeben werden, nicht aber wenn sie in der main-Funktion deklariert werden.
Weiter heißt es: Diese werden ja gelöscht nachdem der Gültigkeitsbereich, in dem sie erzeugt wurden, verlassen wird" :?: dies möchte mir auch nicht wirklich klar werden. Wenn ich es richtig verstanden habe, wird die Variable und der für sie belegte Speicher gelöscht/freigegeben sobald in eine andere Funktion verzweigt wird, doch wie kann es dann sein, dass wenn "zurückverzweigt" wird, die Variable einen wieder zur Verfügung steht, und man mit ihr weiter arbeiten kann.
Zuguterletzt steht in diesem Abschnitt etwas, was noch mehr verwirrt hat, als die oben genannten Probleme
Es lautet folglich: " Globale Variablen kommen als Ausweg nicht in Frage, also bleibt nur noch die Möglichkeit, die Klasseninstanz über den Rückgabewrt an die aufrufende Funktion zu übergeben." :?: Müsste es nicht "Parameterliste" heißen. -> also bleibt nur noch die Möglichkeit, die Klasseninstanzen über die Parameterliste an die aufzurufende Funktion zu übergeben. Weshalb sollte ich sie per Rückgabewert übergeben.

Ich hoffe ich bekomme jetzt nicht sofort einen auf den Deckel und mitdazu den Ratschlag das ich doch gefälligst das Buch von vorn beginnen solle, denn dies habe ich immerhin schon zwei mal gemacht, als ich eine Aufgabenstellung nicht mit dem gewünschten Resultat beenden konnte.
Auch habe ich das Buch nach Hinweisen durchforstet, falls ich irgendetwas "überlesen/übersehen" habe.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

19.06.2007, 18:47

Re: Verständnis Probleme

Zitat von »"Fruchteis"«

ich dachte bis dato, das Variablen oder Instanzen lediglich auf dem Stack erzeugt bzw. abgelegt werden wenn sie an eine Funktion werden


das ist richtig

Zitat von »"Fruchteis"«

nicht aber wenn sie in der main-Funktion deklariert werden.


das ist falsch ;)

Zitat von »"Fruchteis"«


Weiter heißt es: Diese werden ja gelöscht nachdem der Gültigkeitsbereich, in dem sie erzeugt wurden, verlassen wird" :?: dies möchte mir auch nicht wirklich klar werden.


ok, also dann werd ich mal versuchen das zu erklären:

C-/C++-Quelltext

1
2
3
{
  // das ist ein block

}


ein block stellt in C++ einen gültigkeitsbereich dar. wenn du in einem block eine variable deklarierst (und damit definierst):

C-/C++-Quelltext

1
2
3
4
5
6
{
  int x;

  // do something


} // bye bye x


dann "lebt" diese variable vom punkt ihrerer deklaration (= definition in dem fall) weg bis zum ende des blocks (also bis zur }). am ende des blocks wird die variable zerstört (destruktur aufgerufen etc.).

btw: du kannst immer blöcke aufmachen wenn du grad lustig bist. also nicht nur z.b. nach einem if oder einem ähnlichen statement:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
  // ...

  int y = 2;
  int z = 3;

  {
    int x = 0;
    int z = -4;  // verdeckt das z von draußen

    // x gibt es nur hier drinnen

    // y gibts hier drinnen auch, es ist das y von draußen

    // ein z gibt es auch, allerdings verdeckt unser z von hier drinnen

    // das z von draußen. z wäre in diesem block also -4 und nicht 3!!


  } // ab hier gibt es x und das z von hier drinnen nichtmehr!!


  x = 0; // <- fehler!!

  z = 2; // geht, bezieht sich allerdings auf das z das ganz oben in main deklariert ist!

  // ...


}



bei einem funktionsaufruf, werden die parameter ebenfalls auf dem stack abgelegt. aber wenn du eine funktion aufrufst kommst du nirgendwo ans ende eines blocks, es wird daher auch nichts "gelöscht":

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void blub(int a)
{
  a = 145;
  // do something else

}

int main()
{
  int x = 3;

  // funktion aufrufen

  blub(x);  // eine kopie von x wird erzeugt und 

            // auf den stack gelegt. blub arbeitet 

            // mit dieser kopie


  x = 4;  // das echte x gibts es aber trozdem noch

          // wenn blub zurückkehrt hat es immer noch

          // den wert 3


}  // erst hier wird das echte x zerstört



solche variablen liegen auf dem stack.

es gibt aber noch andere speicherklassen als den stack, wie z.b. statischen/globalen speicher (static memory) und den heap (free store). genaueres dazu findest du jedoch in deinem buch ;)

3

19.06.2007, 19:23

Na das nen ich mal ne Erklärung.
Lediglich mit dem erzeugen auf dem Stack, und dem Rückgabetyp komm ich nicht ins Reine.
Wenn eine Variable erzeugt wird wird sie doch nicht auf dem Stack erzeugt, da dieser ja ein separater Speicherbereich ist und für Funktionsaufrufe zuständig ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.06.2007, 19:28

eigentlich gibt es in C++ selbst so etwas wie den stack nicht (also in der sprache selbst ist nirgendwo festgelegt was denn der "stack" wäre).
die variablen oben haben die speicherklasse "auto" (wie der name schon sagt kümmert sich der compiler um die verwaltung des speichers selbst). üblicherweise werden solche variablen vom compiler aber auf dem stack abgelegt ;)

C-/C++-Quelltext

1
2
3
{
  int x;
}


ist das gleiche wie:

C-/C++-Quelltext

1
2
3
{
  auto int x;
}

5

19.06.2007, 20:15

Na allmälich leuchtet mir all dies ein.
Da am Anfang des Buches nirgends verankert war, um welchen Speicherbereich in dem Variablen etc. erzeugt werden es sich eigentlich handelt, bis es schließlich in diesem Kapitel hieß, sie werden auf dem Stack erzeugt.

So jetzt bräuchte ich noch ne Erläuterung mit dem Rückgabewert den er im Abschnitt anspricht. Ich hoffe mal ihr habt nicht den Eindruck das ich diese Buch nicht gründlich gelesen habe ich weiß sehr wohl was der Rückgabewert ist, aber wenn es aufeinmal heißt das Instanzen per Rückgabewert an eine Funktion übergeben werden und nicht mittels Parameterliste dann bin schon etwas verdutzt.

LagRange

Frischling

Beiträge: 26

Wohnort: dzt. Aalborg, DK

Beruf: Student

  • Private Nachricht senden

6

19.06.2007, 20:53

Ich kenn zwar das Buch nicht, aber es klingt als ginge es darum dass die Instanz in einer Unterfunktion erstellt wird und man sie irgendwie an die aufrufende Funtkion übergeben will.

So in etwa:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class myclass
{
    //...

};

myclass unterf( )
{
    myclass inst;
    // ...

    return inst;
}

int main( )
{
    myclass inst2;
    inst2 = unterf( );
}
Science is common sense applied to evidence.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

19.06.2007, 22:53

Ich denke er meint so was in der Art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int foo ()
{
    int x = 5;

    return x;
}

void foo2 (int i)
{
    std::cout << i << std::endl;
}

int main ()
{

    foo2 (foo ()); // Du kannst so anstatt einer Parameterliste eine Funktion aufrufen, welche einen passenden Rückgabewert besitzt.


return 0;
}

8

20.06.2007, 15:13

ik weiß das gehört grad nich her aber wofür und was ist "->"?
Das Leben ist ne Rutschbahn und dann stirbt man...

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

9

20.06.2007, 17:03

Zitat von »"Algorythmus"«

ik weiß das gehört grad nich her aber wofür und was ist "->"?

Haettest nur einen Thread weiter unten anklicken muessen
"Have you tried turning it off and on again?"

10

20.06.2007, 20:35

Erstmal herzlichen Dank für die Antworten bezüglich meiner anderen Fragen in Form von Gültigkeitsbereichen usw.

Nun nochmal zu meiner letzten Frage, die ich woll etwas zu undeutlich formuliert habe.

Also es heißt auf Seite 202 Kapitel 7.7: ....Fangen wir mit einem kleinen Rückblick zum Thema Stack und Heap an. Es wurde ja geklärt, dass lokale Variablen auf dem Stack erzeugt werden. Diese werden ja gelöst, nachdem der Gültigkeitsbereich, in dem sie erzeugt wurden, verlassen wird. Das hat den Nachteil, das wir zum Beispiel Probleme bekommen, wenn wir innerhalb einer Funktion eine Instanz einer Klasse erzeugen, die aber nach Verlassen der Funktion weiterhin gültig sein soll. Globale Variablen kommen als Ausweg ja nicht in Frage, also bleibt nur noch die Möglichkeit, die Klasseninstanzen über den Rückgabewert an die aufrufende Funkion zu übergeben. das ist allerdings recht zeitraubend, da wieder eine komplette Kopie der Instanz auf dem Stack abgelegt werden muss. Erschwerend kommt hinzu, dass man ja nur einen einzigen Rückgabewert zur Verfügung hat.

Meine Frage bzw. das was ich nicht verstehe betrifft den Abschnitt im Text wo es heißt: <<also bleibt nur noch die Möglichkeit, die Klasseninstanzen über den Rückgabewert an die aufrufende Funkion zu übergeben>>

Müsste es nicht lauten : Die Instanz wird per Parameterliste übergeben?!.
Denn der Rückgabewert ist das, was mittels return zurückgeliefert wird.
Eine Funktion besteht aus einen Rückgabetyp, dem Funktionsnamen und der Parameterliste mittels der wir Werte(also Parameter), oder auch Funktionen, Instanzen usw. übergeben. Mittels return liefern wir den Rückgabewert also das Ergebnis der z.B Berechnung die wir anhand der übergebenen Werte (Parameter) berechnet haben zurück.

Warum heißt es aber dort oben, das wir Parameter (in diesem Fall die Instanz) per Rückgabewert an die zu aufrufende Funktion übergeben.??

Bitte um Hilfe

ps. Sorry das ich einen ganzen Abschnitt aus dem Buch herausgeschrieben habe, aber in der Not in der ich mich momentan befinde, kannte ich keinen anderen Ausweg als dies zu tun, da mir einfach die richtigen Worte fehlen, um mein Problem unmissverständlich zu beschreiben.
Ich entschuldige mich hiermit bei Heiko Kalista falls es ihm nicht passt, was ich nicht hoffe, das ich den Text den er verfasst hat 1:1 übernommen habe.

Werbeanzeige