Stack overflow mit srand-initialisierung



  • hallo

    für mein programm verwende ich auch die zufallsfunktion. ich denke, dass der fehler besser ins c++-forum passt, aber er trat eben in turbo c++ auf.

    die laufzeit meines programms ist durch die zufallsfunktion auch von zufall geprägt, ums kurz zu sagen.

    ums lang zu sagen:
    bisweilen stürzt das programm ab, der debugger meldet eine Exception der art stackoverflow.

    hier die zeile aus dem ereignisprotokoll:

    Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EStackOverflow mit Meldung 'Stack-Überlauf'. Prozess ttt_ki_p.exe (3272)

    die betreffende zeile ist die mit srand(). sie sieht so aus:

    srand(static_cast<int>(time(NULL)));
    

    meine vermutung ist, dass der fehler auftritt, weil die funktion rekursiv ist und bei einer bestimmten bedingung sich wiederholt, womit die zeile wieder ausgeführt wird.

    mein problem ist jetzt: wo muss das srand() hin, dass es trotzdem rand() initialisiert, ohne aber wiederholt aufgerufen zu werden?

    danke schon im voraus für das beantworten dieser ( so hoffe ich zumindest ) leichten frage



  • srand() musst Du ja eigentlich nur einmal aufrufen, wenn Du nur eine Folge benötigst. Da der Seed statisch ist, vielleicht im Programmanfang.
    Das wird das Problem wahrscheinlich nicht lösen, da der rekursive Funktionsaufruf ohne Abbruchbedingung wahrscheinlich das Problem ist. Zeig also, wie Du die Rekursion implementiert hast.



  • hallo
    die betreffende funktion sieht so aus:

    int KIEasyNextTurn () {
    	int intReturn;
    	srand(static_cast<int>(time(NULL)));
    	intReturn = rand() %8 +1;
    	if (Feld[intReturn] > 0) {
    		KIEasyNextTurn();
    	} else {
    		return intReturn;
        }
    }
    

    Feld ist ein int-array von 0-8.
    ich wüsste jetzt aber keine andere lösung für dieses problem.



  • - Rufe srand() nur einmal in der Anwendung, außerhalb der Funktion auf.
    - wandle die Rekursion in einer Bedingungsschleife

    int KIEasyNextTurn () {
    
      while (true) {
    
        const int intReturn = rand() %8 +1;
        if (Feld[intReturn]== 0) return intReturn;
      }
    }
    

    - Du hast den Sonderfall nicht berücksichtigt, wenn alle Feldelemente > 0 sind. Du benötigst ein zusätzliches Abbruchkriterium.



  • danke vielmals 🙂

    jetzt funktioniert es wie geplant 🙂

    PS: der sonderfall wird schon vorher abgefangen, muss von der funktion also nicht berücksichtigt werden.


Anmelden zum Antworten