Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Die Philosophie der Funktions-Sprünge

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
02.01.2005, 15:18 Uhr
~Wahwah
Gast


Ich habe mal nachgedacht und philosophiert:

Wenn ich zB ein Spiel schreibe :

// NUR SKIZZEN KRITZEL :


C++:

void spiel()
{
  while(1)
  {
    if( Key.ESCAPE )
           menu();
  }

}

void menu()
{
   while(1)
   {
     if( Menu Wahll == Neuse Spiel starten )
       spiel();
   }
}





Wir in diesem Spiel öfter das Menü geöffnet
und ein neues Spiel gestartet, wird das ja jeweils innerhalb der while schleifen
aufgerufen. Und das immer weiter.

Anderes Beispiiel:



C++:
void a()
{
b();
}
void b()(
{
a();
}




Dies wäre ja auch eine Endlosschleife !
Nur das immer hinundher gespruungen wird und ein pointer auf der jeweiligen Position
stehenbleiibt oder ?

Ich hoffe meine Frage ist verständlich, nich so leicht.

Aber interessant.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.01.2005, 15:32 Uhr
Drager



hm also so wie du das beschreibst, ist das sicher unsinnig... weil dir irgendwann der stack überläuft, von dauernten verschachtelten funktions-aufrufen.

aber wieso machst du nicht einfach bei deiner menu funktion stat "spiel();" einfach "break;"
dann kommste auch wieder ins spiel..... dann springt er ja aus der menu funktion, und kommt wieder in die spiele funktion, da ja die unterfunktion abgearbeitet ist..

Dieser Post wurde am 02.01.2005 um 15:39 Uhr von Drager editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.01.2005, 15:40 Uhr
RedEagle



Das ist abba nicht das Gleiche:

C++:
void spiel()
{
  //Hier gehts weiter wenn er "spiel()" aufruft, was auch sein MUSS, da es ja ein Neues spiel ist, und nicht das alte fortgesetzt wird ;)
  while(1)
  {
    if( Key.ESCAPE )
           menu();
    //Bei "break;"  gehts hier weiter
  }

}



Deutlicher:


C++:
void spiel()
{
  int irgendwas = init_irgendwas(irgendwas);
  while(1)
  {
    if( Key.ESCAPE )
           menu();
  }

}



Bei break; wird alles vor der Schleife weggelassen, was aber evtl wichtig ist, wenn er das Spiel neu starten möchte.
--
MFG RedEagle

Dieser Post wurde am 02.01.2005 um 15:42 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.01.2005, 16:13 Uhr
mmc20
puss in boots


hi, mal ne andere frage... wenn du das so proggst, auf welche art lässt sich denn das spiel beenden ?!
die while(1) sind eh etwas sinnlos da du da nie rauskommst. also besser so:

C++:
void spiel()
{
neusesSpiel:
// hier spiel initialisieren
  while( ! Key.ESCAPE )
  {
weitermachen:
  // hier läuft die spiele schleife
  }
  int menuwahl = menu();
  switch( menuwahl )
  {
     case 1: { goto neuesSpiel; break; }
     case 2: { goto weitermachen; break; }
     case 3: { break; } // beenden
  }
beenden:
// hier aufräumen
}

int menu()
{
   while( ! key.RETURN )
   {
   // hier menu
   }
   return menuwahl;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.01.2005, 16:26 Uhr
RedEagle




C++:
int main()
{
while(spiel)
{
  //Kann man das hier leer lassen???
}
}

int spiel()
{
// hier spiel initialisieren
bool run = true;

  while( ! Key.ESCAPE || run)
  {
  // hier läuft die spiele schleife
  }
  int menuwahl = menu();
  switch( menuwahl )
  {
     case 1: { return 1; }
     case 2: { break; }
     case 3: { run=false; } // beenden
  }
// hier aufräumen
return 0;
}

int menu()
{
   while( ! key.RETURN )
   {
   // hier menu
   }
   return menuwahl;
}



1. goto ist mist
2. So sollte es gehen:
wenn 1(Neues spiel) gedrückt wird wird das aktuelle Spiele beendet, und die Funktion Spiel erneut aufgrefen (Wein >0 zurückgegeben wird)
wenn 2(Weiter) gedrückt wird, wird die "switch - Anweisund" beendet und es geht weiter
wenn 3 (Beenden) gedrückt wird, wird die Variable "run" auf False gesetzt, und die Schleife beendet
--
MFG RedEagle

Dieser Post wurde am 02.01.2005 um 16:27 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.01.2005, 16:47 Uhr
Hans
Library Walker
(Operator)



Zitat von ~Wahwah:
Ich habe mal nachgedacht und philosophiert:
Anderes Beispiiel:

C++:
void a()
{
b();
}
void b()(
{
a();
}



Dies wäre ja auch eine Endlosschleife !



Theoretisch ja, praktisch liefert das irgendwann einen Stapel- bzw. Stacküberlauf. Wenn Du das mal praktisch testen willst, kannst Du das mit diesem etwas erweiterten Code machen:

C++:
#include <stdio.h>

void a();
void b();

int main()
{
  a();
  return 0;
}

void a()
{
  static int i=0;

  i++;
  if ((i%100)==0)
     printf ("%d\n", i);
  b();
}

void b()
{
  static int i=0;

  i++;
  if ((i%100)==0)
     printf ("%d\n", i);
  a();
}


Das ist in diesem Fall C-Code, sieht aber in C++ nicht wesentlich anders aus. Bei mir kommt die Fehlermeldung, wenn beide Funktionen 65300 ausgegeben haben. Aber das dürfte von Rechner zu Rechner unterschiedlich sein.


Zitat:
Nur das immer hinundher gespruungen wird und ein pointer auf der jeweiligen Position
stehenbleiibt oder ?


Was für ein Pointer soll denn da wo stehen bleiben?
In deinem Beispielcode sind keine Pointer drin. Und wenn Du einen CPU-internen Pointer meinst, da ist es so, das der Stackpointer irgendwann in einen Speicherbereich zeigt, der nicht mehr zum Stack dazu gehört. Dann kommt die Fehlermeldung.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.01.2005, 21:50 Uhr
Drager




Zitat von mmc20:

die while(1) sind eh etwas sinnlos da du da nie rauskommst. also besser so:



hm sicher komm ich da raus.. mit break... aber ist halt nicht sehr elegant...



Zitat von RedEagle:

C++:
int main()
{
while(spiel)
{
  //Kann man das hier leer lassen???
}
}




sicher kann man das leer lassen, aber wieso nicht gleich


C++:

while(spiel);





C++:
int spiel()
{
// hier spiel initialisieren
bool run = true;

  while( ! Key.ESCAPE || run)
  {
  // hier läuft die spiele schleife
  }
  int menuwahl = menu();
  switch( menuwahl )
  {
     case 1: { return 1; }
     case 2: { break; }
     case 3: { run=false; } // beenden
  }
// hier aufräumen
return 0;
}

int menu()
{
   while( ! key.RETURN )
   {
   // hier menu
   }
   return menuwahl;
}



1. goto ist mist
2. So sollte es gehen:
wenn 1(Neues spiel) gedrückt wird wird das aktuelle Spiele beendet, und die Funktion Spiel erneut aufgrefen (Wein >0 zurückgegeben wird)
wenn 2(Weiter) gedrückt wird, wird die "switch - Anweisund" beendet und es geht weiter
wenn 3 (Beenden) gedrückt wird, wird die Variable "run" auf False gesetzt, und die Schleife beendet



äh im falle 1 wird dann aber nicht aufgeräumt, da er keine befehle mehr nach return 1 in diesem funktionsaufruf mehr abarbeitet...
bei fall 2 gehts net wirklich weiter, da du nur aus der switch anweisung springst.. in die while darüber kommt er nicht mehr, also räumt er auf und beendet das spiel (return 0) bei deinem fall 2...
fall 3 ist auch unsinnig so wie du es geschrieben hast, da wie gesagt er nicht mehr in die while schleife darüber kommt... und dann eh auf return 0 stösst...

also ich würde das entweder wie mmc20 machen, goto ist garnet soo schlecht, kann nur wenn man es zu oft benutzt unübersichtlich werden...

ansonsten einfach:


C++:

void spiel()
{
  while(1)
  {
    if( Key.ESCAPE )
           menu();
  }

}

void menu()
{
   while(1)
   {
     if( Menu Wahll == Neuse Spiel starten )
       neuesSpielInit(); //initialisiert alles fuer ein neues spiel...
       break;
   }
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.01.2005, 23:05 Uhr
Hans
Library Walker
(Operator)


Ansonsten, wenn es um Spieleprogrammierung geht:

Bei Amazon.

scnr,
Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.01.2005, 23:33 Uhr
mmc20
puss in boots


ho ho, heisse diskusion ! ;-)

das war auch nur ein beispiel... besser wäre natürlich das in der main laufen zu lassen, und nur die funktionen menu und spiel hinzufügen...

C++:
int main()
{
  bool loop = true;
  while(loop)
  {
    spiel();
    int menuwahl = menu();
// menuauswertung
// ende ? loop = false;
  }
  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.01.2005, 00:05 Uhr
Hans
Library Walker
(Operator)



Zitat von mmc20:
ho ho, heisse diskusion ! ;-)

das war auch nur ein beispiel... besser wäre natürlich das in der main laufen zu lassen, und nur die funktionen menu und spiel hinzufügen...

Hi,
da hast Du völlig recht, aber ich hab auch einige Zeit gebraucht, bis ich das begriffen hatte
Und ich würde es dann so machen:

C++:
int main()
{
  bool loop = true;
  while(loop)
  {
    int menuwahl = menu();
// menuauswertung
// ende ? loop = false; break;
    spiel();
  }
  return 0;
}


Aber das ist wiederum eine Geschmacksfrage.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: