2016-04-24 13 views
-1

Ich habe eine Anwendung zum Testen der Martingale-Strategie, aber ich bekomme diese lästige Ausnahme in meiner App während des Betriebs.Getting StackOverflowException in einer Schleife

Vollanwendungscode für die Prüfung:

Module Module1

Dim basebet, balance, rollunder, sleep As Integer 
Dim increaseby As Decimal 
Dim bet As Decimal 

Dim confTarget As Integer 

Sub Main() 
    bootConf() 
    Menu() 
End Sub 

Sub bootConf() 

    basebet = 1   '1 Base Bet 
    bet = 1    'Current Bet 
    increaseby = 3  'Multiplier on loss 
    balance = 50000  '100 Starting Balance 
    rollunder = 4998  '1% House Edge 
    sleep = 50   'Sleep between bets in MS 

End Sub 

Sub basebetConf(ByVal newVal As Integer) 
    basebet = newVal 
    Conf() 
End Sub 
Sub increasebyConf(ByVal newVal As Integer) 
    increaseby = newVal 
    Conf() 
End Sub 
Sub balanceConf(ByVal newVal As Integer) 
    balance = newVal 
    Conf() 
End Sub 
Sub rollunderConf(ByVal newVal As Integer) 
    If newVal > 4999 Then 
     Conf() 
    ElseIf newVal < 1 Then 
     Conf() 
    Else 
     rollunder = newVal 
     Conf() 
    End If 
End Sub 
Sub sleepConf(ByVal newVal As Integer) 
    sleep = newVal 
    Conf() 
End Sub 

Sub Conf() 
    Console.Clear() 
    Console.WriteLine("") 
    Console.WriteLine("         Martingale Simulator") 
    Console.WriteLine("         Developed by Art3mis") 
    Console.WriteLine("") 
    Console.WriteLine("        CONFIGURATION") 
    Console.WriteLine("        ¯¯¯¯¯¯¯¯¯¯¯¯¯") 
    Console.WriteLine("        BASE BET   : " & basebet) 
    Console.WriteLine("        LOSE MULTIPLIER  : " & increaseby) 
    Console.WriteLine("        BASE BALANCE  : " & balance) 
    Console.WriteLine("        ROLLUNDER (0-5000) : " & rollunder) 
    Console.WriteLine("        SLEEP (IN MILLISEC) : " & sleep) 
    Console.WriteLine("") 
    Console.WriteLine("         Select value to edit (1-5)") 
    Console.WriteLine("         Press X to return.") 
    Console.Write("          > ") 
    Dim input As ConsoleKeyInfo = Console.ReadKey() 
    If input.Key = ConsoleKey.D1 Then 
     confTarget = 1 
    ElseIf input.Key = ConsoleKey.D2 Then 
     confTarget = 2 
    ElseIf input.Key = ConsoleKey.D3 Then 
     confTarget = 3 
    ElseIf input.Key = ConsoleKey.D4 Then 
     confTarget = 4 
    ElseIf input.Key = ConsoleKey.D5 Then 
     confTarget = 5 
    ElseIf input.Key = ConsoleKey.X Then 
     Menu() 
    Else 
     Conf() 
    End If 
    Console.WriteLine("") 
    Console.WriteLine("") 
    Console.WriteLine("         Enter new value") 
    Console.WriteLine("         Press X to return.") 
    Console.Write("          > ") 
    Dim input2 As Integer = Console.ReadLine() 
    If confTarget = 1 Then 
     basebetConf(input2) 
    ElseIf confTarget = 2 Then 
     increasebyConf(input2) 
    ElseIf confTarget = 3 Then 
     balanceConf(input2) 
    ElseIf confTarget = 4 Then 
     rollunderConf(input2) 
    ElseIf confTarget = 5 Then 
     sleepConf(input2) 
    End If 
     'Console.Read() 

End Sub 

Sub Menu() 
    Console.Clear() 
    Console.WriteLine("") 
    Console.WriteLine("         Martingale Simulator") 
    Console.WriteLine("         Developed by Art3mis") 
    Console.WriteLine("") 
    Console.WriteLine("        ╔═ MENU ═════════════════╗") 
    Console.WriteLine("        ╠═ 1 : START    ║") 
    Console.WriteLine("        ╠═ 2 : CONFIGURATION  ║") 
    Console.WriteLine("        ╠═ 3 : ABOUT & CREDITS ║") 
    Console.WriteLine("        ╚════════════════════════╝") 
    Console.Write("        > ") 
    Dim input As ConsoleKeyInfo = Console.ReadKey() 
    If input.Key = ConsoleKey.D1 Then 
     Console.Clear() 
     Console.WriteLine("") 
     Console.WriteLine("         Martingale Simulator") 
     Console.WriteLine("         Developed by Art3mis") 
     Console.WriteLine("") 
     Roll() 
    ElseIf input.Key = ConsoleKey.D2 Then 
     Conf() 
    ElseIf input.Key = ConsoleKey.D3 Then 
     About() 
    Else 
     Menu() 
    End If 


End Sub 

Sub Roll() 
    Dim rn As New Random 
    Dim roll As Integer 
    roll = rn.Next(0, 10000) 
    If roll > rollunder Then 
     'Console.ForegroundColor = ConsoleColor.Red 
      Console.WriteLine("LOSE - " & roll & " - Bet: " & bet) 
     'Console.ResetColor() 
      balance -= bet 
      bet = bet * increaseby 
      Console.Title = "Martingale Sim - Balance: " & balance 
    Else 
     'Console.ForegroundColor = ConsoleColor.Green 
      Console.WriteLine("WIN - " & roll & " - Bet: " & bet) 
     'Console.ResetColor() 
      balance += bet 
      bet = basebet 
      Console.Title = "Martingale Sim - Balance: " & balance 
    End If 
    Threading.Thread.Sleep(sleep) 
    checkRoll() 
End Sub 

Sub checkRoll() 
    If balance < 0 Then 
     MsgBox("Ran out of balance.") 
    Else 
     Roll() 
    End If 

End Sub 

Sub About() 


End Sub 
End Module 

Hier ist der Ort, an dem die Anwendung fehlschlägt und wirft die Ausnahme:

If roll > rollunder Then 
     'Console.ForegroundColor = ConsoleColor.Red 
      Console.WriteLine("LOSE - " & roll & " - Bet: " & bet) *** HERE! 
     'Console.ResetColor() 
      balance -= bet 
      bet = bet * increaseby 
      Console.Title = "Martingale Sim - Balance: " & balance 
    Else 
     'Console.ForegroundColor = ConsoleColor.Green 
      Console.WriteLine("WIN - " & roll & " - Bet: " & bet) *** HERE! 
     'Console.ResetColor() 
      balance += bet 
      bet = basebet 
      Console.Title = "Martingale Sim - Balance: " & balance 
    End If 
    Threading.Thread.Sleep(sleep) 
    checkRoll() 

Ich bin mir bewusst, dass dies geschieht, weil Es ist in einer Endlosschleife. Ich habe in dieser Situation nichts gefunden, was mir helfen könnte, also weiß ich nicht wirklich, was ich tun soll.

Hier ist ein Screenshot zeigt den Bug: http://prntscr.com/aw7mqd

Vielen Dank im Voraus!

A

+2

'Roll()' ruft 'checkRoll()' 'die Rolle ruft()', das ruft 'checkRoll()' (wenn die Bedingungen stimmen, die sie fast jedes Mal sind?). Sie müssen die Aufrufe so umstrukturieren, dass Sie eine Funktion mit unendlichen Schleifen haben, wie 'while (true) {roll(); if (balance <0) break;} 'und nimm den Aufruf' checkRoll() 'innerhalb von' roll() '. Das würde das Problem der unendlichen Rekursion lösen, da 'roll()' jetzt reapidiert aufgerufen wird, ohne dass weitere Aufrufe sich selbst wieder aufrufen. Das Problem ist, dass der Stack mit jedem 'CALL' wächst, das Sie erzeugen, nicht eine Endlosschleife pro sé. –

Antwort

0

ein Beispiel zu geben, was @Maximilian sich bezieht, Ihre Roll und checkRoll Methoden ändern etwa wie folgt aussehen, die Rekursion die Notwendigkeit vermeidet.

Sub Roll() 
    Do 
     ... 
    Loop While checkRoll() 
End Sub 

Function checkRoll() As Boolean 
    If balance < 0 Then 
     MsgBox("Ran out of balance.") 
     Return False 
    End If 
    Return True 
End Function 
+0

Das funktioniert. Vielen Dank! –