Nicht genügend Stappelspeicher, in Schleife verfangen nur wie ?

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Nicht genügend Stappelspeicher, in Schleife verfangen nur wie ?

    Hallo

    Könnte mir bitte jemand bei meinem Problem helfen ?

    Dieser unten stehende code hat mir heute schon so einiges Kopfzerbrechen bereitet aber ich
    stehe jetzt kurz vor dem Ziel, nachdem ich die Debugfunktion entdeckt habe. Nachdem ich die Meldung

    "nicht genügend Stapelspeicher" bekommen habe hat mir der Debugmodus gezeigt, dass er sich bei der Sub packen in eine
    Schleife verfangen hat aus der er nicht mehr rauskommt. Nur kann ich nicht sehen warum er da nicht mehr rauskommt.
    An den Werten aus der Excel Tabelle kann es meines Achtens nicht liegen. Ich habe für Alle breiten 2 und für alle Anzahlen 5. Er müsste also jedesmal


    nach fünf Durchgängen die Schleife wieder verlassen, die Abbruchbedingung ist ja null ! Oder verstehe ich irgendetwas falsch ?

    Visual Basic-Quellcode

    1. Public Function Kisten()
    2. Dim rng1 As Range
    3. Set rng1 = Worksheets("Tabelle1").Range("A1:A10")
    4. Dim Kistenbreite(1 To 10) As Integer
    5. Dim r As Range
    6. For Each r In rng1
    7. Kistenbreite(r.Row) = r.Value
    8. Next
    9. Dim rng As Range
    10. Set rng = Worksheets("Tabelle1").Range("B1:B10")
    11. Dim Kistenanzahl(1 To 10) As Integer
    12. Dim r1 As Range
    13. For Each r1 In rng
    14. Kistenanzahl(r1.Row) = r1.Value
    15. Next
    16. Dim Hvb As Integer
    17. Hvb = 0
    18. Dim x As Integer
    19. x = Worksheets("Tabelle1").Range("A11").Value
    20. Dim zahlkisten As Integer
    21. zahlkisten = Kistenanzahl(0)
    22. Dim breitekisten As Integer
    23. breitekisten = Kistenbreite(0)
    24. Dim a As Integer
    25. a = 0
    26. Do
    27. Call packen(breitekisten, zahlkisten, Hvb)
    28. a = a + 1
    29. breitekisten = Kistenbreite(a + 1)
    30. zahlkisten = Kistenanzahl(a + 1)
    31. Loop Until Hvb <= x
    32. MsgBox ("Der Wert ist" & Hvb)
    33. End Function
    34. Public Sub packen(Breite As Integer, Anzahl As Integer, d As Integer)
    35. d = d + Breite
    36. Anzahl = Anzahl - 1
    37. Do
    38. Call packen(Breite, Anzahl, d)
    39. Loop Until Anzahl = 0
    40. End Sub

    Visual Basic-Quellcode

    1. Public Sub packen(Breite As Integer, Anzahl As Integer, d As Integer)
    2. Anzahl = Anzahl - 1
    3. Do
    4. Call packen(Breite, Anzahl, d)
    5. Loop Until Anzahl = 0
    6. End Sub
    Ein rekursiver Aufruf noch (dazu in einer Schleife) geht meistens schief, wenn man nicht weiß, was man tut
    Geh den Code mal schrittweise im Debugger durch, dann merkst du schnell, wie du zu deinem Overflow kommst.


    Ich tippe mal, dass die Abbruchbedingung nie erreicht wird, weil die Anzahl unter 0 geht.
    Ich überlege mir jetzt nicht, ob die Schleife in Verbindung mit der Rekursion überhaupt Sinn macht, aber als Abbruchbedingung würde ich dann zumindest so eine Variante nehmen:

    Visual Basic-Quellcode

    1. Do While Anzahl > 0
    2. ...
    3. Loop
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()