Stack Overflow bei erneutem Sub aufruf

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Schakal26.

    Stack Overflow bei erneutem Sub aufruf

    Hallo Zusammen,

    ich hab mir ein Tic Tac Toe gepastelt in dem es zwei schwierigkeitsgrade gibt im ersten Setzt der NPC per zufall, im zweiten soll er verhindern das ich eine Reihe bekomme was auch ein zwei mal funktioniert.

    Dann aber bricht er ab und gibt mir eine Stack overflow Meldung heraus.

    Ich hoffe mir kann wer sagen woran das liegt

    VB.NET-Quellcode

    1. Public Sub KI()
    2. If Spieler = 1 And Spielende = 0 Then
    3. Dim Spielzahl As Integer
    4. Dim x, y As Integer
    5. x = 0
    6. y = 0
    7. If Schwierigkeit = 0 Then
    8. Spielzahl = Zufall.Next(1, 10)
    9. ElseIf Schwierigkeit = 1 Then
    10. If Spielfeld(1, 1) = 1 And Spielfeld(1, 2) = 1 Or Spielfeld(3, 3) = 1 And Spielfeld(2, 3) = 1 Then
    11. Spielzahl = 3
    12. ElseIf Spielfeld(1, 2) = 1 And Spielfeld(1, 3) = 1 Or Spielfeld(3, 1) = 1 And Spielfeld(2, 1) = 1 Then
    13. Spielzahl = 1
    14. ElseIf Spielfeld(1, 1) = 1 And Spielfeld(1, 3) = 1 Or Spielfeld(2, 2) = 1 And Spielfeld(3, 2) = 1 Then
    15. Spielzahl = 2
    16. ElseIf Spielfeld(2, 1) = 1 And Spielfeld(2, 2) = 1 Or Spielfeld(1, 3) = 1 And Spielfeld(3, 3) = 1 Then
    17. Spielzahl = 6
    18. ElseIf Spielfeld(2, 2) = 1 And Spielfeld(2, 3) = 1 Or Spielfeld(1, 1) = 1 And Spielfeld(3, 1) = 1 Then
    19. Spielzahl = 4
    20. ElseIf Spielfeld(2, 1) = 1 And Spielfeld(2, 3) = 1 Or Spielfeld(1, 2) = 1 And Spielfeld(3, 2) = 1 Then
    21. Spielzahl = 5
    22. ElseIf Spielfeld(3, 1) = 1 And Spielfeld(3, 2) = 1 Or Spielfeld(1, 3) = 1 And Spielfeld(2, 3) = 1 Then
    23. Spielzahl = 9
    24. ElseIf Spielfeld(3, 1) = 1 And Spielfeld(3, 3) = 1 Or Spielfeld(2, 2) = 1 And Spielfeld(1, 2) = 1 Then
    25. Spielzahl = 8
    26. ElseIf Spielfeld(3, 2) = 1 And Spielfeld(3, 3) = 1 Or Spielfeld(1, 1) = 1 And Spielfeld(2, 1) = 1 Then
    27. Spielzahl = 7
    28. ElseIf Spielfeld(1, 1) = 1 And Spielfeld(3, 3) = 1 Or Spielfeld(1, 3) = 1 And Spielfeld(3, 1) = 1 Then
    29. Spielzahl = 5
    30. ElseIf Spielfeld(1, 1) = 1 And Spielfeld(2, 2) = 1 Then
    31. Spielzahl = 9
    32. ElseIf Spielfeld(3, 3) = 1 And Spielfeld(2, 2) = 1 Then
    33. Spielzahl = 1
    34. ElseIf Spielfeld(1, 3) = 1 And Spielfeld(2, 2) = 1 Then
    35. Spielzahl = 7
    36. ElseIf Spielfeld(3, 1) = 1 And Spielfeld(2, 2) = 1 Then
    37. Spielzahl = 3
    38. Else : Spielzahl = Zufall.Next(1, 10)
    39. End If
    40. ElseIf Schwierigkeit = 2 Then
    41. End If
    42. Select Case Spielzahl
    43. Case 1
    44. If Spielfeld(1, 1) = 0 Then
    45. x = 80
    46. y = 80
    47. SpielfigurSetzen(x, y, 2)
    48. Spieler = 2
    49. SpielAuswertung()
    50. Else : KI()
    51. End If
    52. Case 2
    53. If Spielfeld(1, 2) = 0 Then
    54. x = 160
    55. y = 80
    56. SpielfigurSetzen(x, y, 2)
    57. Spieler = 2
    58. SpielAuswertung()
    59. Else : KI()
    60. End If
    61. Case 3
    62. If Spielfeld(1, 3) = 0 Then
    63. x = 240
    64. y = 80
    65. SpielfigurSetzen(x, y, 2)
    66. Spieler = 2
    67. SpielAuswertung()
    68. Else : KI()
    69. End If
    70. Case 4
    71. If Spielfeld(2, 1) = 0 Then
    72. x = 80
    73. y = 160
    74. SpielfigurSetzen(x, y, 2)
    75. Spieler = 2
    76. SpielAuswertung()
    77. Else : KI()
    78. End If
    79. Case 5
    80. If Spielfeld(2, 2) = 0 Then
    81. x = 160
    82. y = 160
    83. SpielfigurSetzen(x, y, 2)
    84. Spieler = 2
    85. SpielAuswertung()
    86. Else : KI()
    87. End If
    88. Case 6
    89. If Spielfeld(2, 3) = 0 Then
    90. x = 240
    91. y = 160
    92. SpielfigurSetzen(x, y, 2)
    93. Spieler = 2
    94. SpielAuswertung()
    95. Else : KI()
    96. End If
    97. Case 7
    98. If Spielfeld(3, 1) = 0 Then
    99. x = 80
    100. y = 240
    101. SpielfigurSetzen(x, y, 2)
    102. Spieler = 2
    103. SpielAuswertung()
    104. Else : KI()
    105. End If
    106. Case 8
    107. If Spielfeld(3, 2) = 0 Then
    108. x = 160
    109. y = 240
    110. SpielfigurSetzen(x, y, 2)
    111. Spieler = 2
    112. SpielAuswertung()
    113. Else : KI()
    114. End If
    115. Case 9
    116. If Spielfeld(3, 3) = 0 Then
    117. x = 240
    118. y = 240
    119. SpielfigurSetzen(x, y, 2)
    120. Spieler = 2
    121. SpielAuswertung()
    122. Else : KI()
    123. End If
    124. End Select
    125. End If
    126. End Sub
    Poste doch bitte den Rest dazu, dann geht es schneller mit dem Helfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nimm Deinen Code aus dem 1. Post, füge ihn in ein jungfräulches Projekt ein und schreibe so viel an Code rein, dass Dein Fehler auftritt. Das, was Du da reingeschrieben hast, poste bitte.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du dürftest in eine Rekursive Endlosschleife kommen.

    VB.NET-Quellcode

    1. 'Schwierigkeit = 1
    2. Spielfeld(1,1) ist 1;
    3. 1,2 ist 0;
    4. 3,1 ist 1;
    5. 2,1 ist 1;
    6. 3,3 ist 0;
    7. Sub KI()
    8. If Spielfeld(1, 1) = 1 And Spielfeld(1, 2) = 1 Or Spielfeld(3, 3) = 1 And Spielfeld(2, 3) = 1 Then ' Trifft NIcht ZU
    9. Spielzahl = 3
    10. ElseIf Spielfeld(1, 2) = 1 And Spielfeld(1, 3) = 1 Or Spielfeld(3, 1) = 1 And Spielfeld(2, 1) = 1 Then 'Trifft ZU
    11. Spielzahl = 1
    12. Spielzahl wird 1
    13. Dann kommst du hierher:
    14. Select Case Spielzahl
    15. Case 1
    16. If Spielfeld(1, 1) = 0 Then ' 1,1 ist aber 1, darum
    17. x = 80
    18. y = 80
    19. SpielfigurSetzen(x, y, 2)
    20. Spieler = 2
    21. SpielAuswertung()
    22. Else : KI() 'KI() wieder aufrufen, nur was soll diesmal anders laufen ? -> NICHTS, daher läuft man wieder hier hinein
    23. End If


    Diese ganzen Verschachtelungen sind gefährlich und nicht allzu schön ^^
    Das ist meine Signatur und sie wird wunderbar sein!
    Wenn VB eine Sub aufruft, muss sie sich das irgendwo merken, da es sonst nicht weiß, wo es nach dieser Sub weitermachen soll. Dieser Ort ist der Stack. Du rufst in der Sub die Sub nochmals auf, womit sich VB diesen Aufruf ebenfalls im Stack merkt. Und wenn das öfters geschieht, is der halt irgendwann voll --> Stack overflow -> Stapelüberlauf

    Der Fehler steckt in Zeile 60, 69, 78, ... Ich denke, der komplette Ansatz deines Versuchs ist nicht optimal (vorsichtig ausgedrückt)
    Den Stack durch reines Aufrufen von Prozeduren vollzukriegen ist sicherlich möglich.. aber im Normalfall brauchst dazu schon ne Endlosschleife ;)
    Und diese ist eben gegeben und das Problem..
    Das ist meine Signatur und sie wird wunderbar sein!