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

20.05.2008, 12:31

Aufgabe 5.11

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int menuErstellen();
int menuAuswahl;

int main ()
{
    menuErstellen();
    
    switch (menuAuswahl)
        {
            case (1):
            {
            } break;
        
            default:
            {
                std::cout << "(1-5) sind gültige Eingaben\n";
                main();
            }
        }


Hallo, ich habe bis jetzt im gesamten Buch noch nicht gesehen, dass die main Funktion nochmal aufgerufen wurde. Insofern würde ich den Augenmerk gerne auf das "default" richten. Ist es empfehlenswert mit der main Funktion, wie mit jeder anderen Funktion zu verfahren oder spricht da irgendetwas gegen?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

20.05.2008, 12:50

Hi. Nein, das ist nicht erlaubt.

Mach da lieber eine Schlaufe rein, wo du so lange durchgehst, solange erlaubte Eingaben gemacht werden.

3

20.05.2008, 12:56

Okay danke :-)

Aber wieso ist es nicht erlaubt?

Es tut ja zumindest das erwartete.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

20.05.2008, 13:10

Selbst wenn das deinen Erwartungen entsprechende Ergebnisse liefert läuft das Programm Gefahr einem Stacküberlauf zu erliegen.
Da ist goto sogar noch die bessere Alternative...
@D13_Dreinig

5

20.05.2008, 13:35

Mh würde es theoretisch nicht gehen wenn man dann eben die letzte main() Instanz löschen würde?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

20.05.2008, 13:36

Vereinfachung eines grösseren Programmes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

int* i = 0;

int main() {

     i = new int; //Speicheranforderungen


     if (*i < 2) //Bedingungen prüfen

         main (); //Funktionen aufrufen

     
     delete i; //Speicher wieder freigeben.

}


Kling ja alles gut, jedoch gibt das ein Problem, da der Speicher, der bereits angefordert wird nochmal angefordert wird.
Naja. Mein Beispiel ist zugegebenermassen ein wenig konstruiert, aber wenn man nicht aufpasst, passiert das schnell.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

20.05.2008, 13:37

Zitat von »"raXor"«

Mh würde es theoretisch nicht gehen wenn man dann eben die letzte main() Instanz löschen würde?


main ist ne Funktion und kein Objekt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

20.05.2008, 13:44

Zitat von »"drakon"«


Kling ja alles gut, jedoch gibt das ein Problem, da der Speicher, der bereits angefordert wird nochmal angefordert wird.
Naja. Mein Beispiel ist zugegebenermassen ein wenig konstruiert, aber wenn man nicht aufpasst, passiert das schnell.


Wäre das nicht die main Funktion wäre auch alles gut... Die Speicherfreigabe, des von i-gezeigten Speichers, ist hier nämlich garkein problem.
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

20.05.2008, 13:51

Zitat von »"David_pb"«

Zitat von »"drakon"«


Kling ja alles gut, jedoch gibt das ein Problem, da der Speicher, der bereits angefordert wird nochmal angefordert wird.
Naja. Mein Beispiel ist zugegebenermassen ein wenig konstruiert, aber wenn man nicht aufpasst, passiert das schnell.


Wäre das nicht die main Funktion wäre auch alles gut... Die Speicherfreigabe, des von i-gezeigten Speichers, ist hier nämlich garkein problem.


Nein, aber so weit kommt es erst gar nicht. Den er crasht bereits bei der 2 Allokation.

Und nein, auch eine andere Funktion, die so implementiert ist, hat das gleiche Problem. Allein der Unterschied ist, dass man das bei einer anderen Funktion intuitiv richtiger macht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

20.05.2008, 13:59

Ah, ich übersah die globale Variable. Aber das sollte beim zweiten Allokieren trotzdem nicht 'crashen'. Du bekommst nur ein Speicherleak. Warum das bei dir 'crasht' ist wegen des übervollen Stacks, das hat aber nicht mit i und deiner Speicheranforderung zu tun.
@D13_Dreinig

Werbeanzeige