2016-04-24 29 views
-1

我做了一個應用程序來測試Martingale策略,但在運行時我的應用程序中出現了這個煩人的異常。測試在一個循環中獲取StackOverflowException

完整的應用程序代碼:

模塊模塊1

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 

這裏就是申請失敗,並拋出異常的斑點:

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() 

我知道,這是因爲它處於一個無限循環。在這種情況下,我找不到任何東西來幫助我,所以我不知道該怎麼做。

這裏顯示的bug截圖:http://prntscr.com/aw7mqd

提前感謝!

一個

+2

'卷()'是調用'checkRoll()'這是調用'卷()'這是調用'checkRoll()'(如果條件合適,他們幾乎每次?)。你需要重構調用,使得你有一個有無限循環的函數,比如'while(true){roll();如果(balance <0)break;}'並在'roll()'內取出'checkRoll()'調用。這將解決無限遞歸問題,因爲'roll()'現在可以被重新調用,而不會再進行任何進一步調用。問題在於堆棧隨着你所做的每個CALL而增長,而不是每個sé的無限循環。 –

回答

0

給什麼@Maximilian指的是,改變你的RollcheckRoll方法看起來像以下,避免了遞歸需要的例子。

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

這工作。謝謝! –