This is more to do with my code as i’m sure i’m doing something wrong
all i’m trying to do is call a main function to repeated itself with a recursive number that at some point i’ll reset.
here is my code
sys.setrecursionlimit(8000) didMenuFinish = 0 def mainThread(interval): time.sleep(0.2) print("interval is: " + str(interval)) if (interval < 1650): raceTrack(interval) if (interval == 1680): resetButtons() restartRace() if didMenuFinish==0: mainThread(interval + 1) else: didMenuFinish = 0 mainThread(0) time.sleep(4) keyboard.press(Key.enter) keyboard.release(Key.enter) mainThread(0)
At first the main thread runs fine, but somewhere in the 2500 interval +- it just stops with the error code for stack overflow
Process finished with exit code -1073741571 (0xC00000FD)
I am using Windows and pyCharm
do you know how I can handle that ? or am i doing something wrong ?
Advertisement
Answer
You are most likely recursively looping forever. You recursively call mainThread
in these parts:
def mainThread(interval): # ... if didMenuFinish == 0: mainThread(interval + 1) else: didMenuFinish = 0 mainThread(0)
But you never return
to the caller. You need a base case that stops the recursive loop
Consider this example of a recursive factorial function:
def fac(x): if x <= 1: return 1 return x*fac(x-1)
The base case (terminating case) is when x <= 1
. and this will be reached eventually as fac(x-1)
implies that x
is decreasing towards the conditional x <= 1
. i.e. you need to have some sort of case where recursion is not needed. Your current function is recursively equivalent to:
def foo(): foo()
Perhaps infinitely looping and locally updating variables will work?
def mainThread(interval): while True: time.sleep(0.2) print(f"interval is: " {interval}) if interval < 1650: raceTrack(interval) if interval == 1680: resetButtons() restartRace() if didMenuFinish == 0: # No need to call the function again. just change the local variable interval += 1 else: didMenuFinish = 0 # Same here interval = 0