überlauffehler durch msgbox ersetzen

  • Sonstige

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Blauarschbube666.

    überlauffehler durch msgbox ersetzen

    hallo!
    ich habe das problem, dass in meinem gauss-algorithmus ein überlauffehler auftritt, den ich allerdings durch eine msgbox einen schritt davor unterbinden und anschließend die ganze prozedur beenden möchte.
    das kriege ich absolut nicht hin

    ich gebe mal die variablenbereiche und die besagte stelle ein.

    Visual Basic-Quellcode

    1. Sub gaussalgo(n%, A() As Double, x() As Double)
    2. Dim max As Double, s As Double, skal() As Double
    3. Dim z%, k%, y%, kmax%, zmax%, merk() As Integer
    4. ReDim merk(n), skal(n)
    5. [...]
    6. For k = 1 To n - 1
    7. max = skal(k) * Abs(A(k, k))
    8. kmax = k
    9. zmax = k
    10. For z = k To n
    11. For y = k To n
    12. If skal(z) * Abs(A(z, y)) > max Then
    13. zmax = z
    14. kmax = y
    15. max = skal(z) * Abs(A(z, y))
    16. End If
    17. Next
    18. Next
    19. If zmax <> k Then
    20. For z = k To n + 1
    21. s = A(k, z)
    22. A(k, z) = A(zmax, z)
    23. A(zmax, z) = s
    24. Next
    25. s = skal(k)
    26. skal(k) = skal(zmax)
    27. skal(zmax) = s
    28. End If
    29. If kmax <> k Then
    30. For y = 1 To n
    31. s = A(y, k)
    32. A(y, k) = A(y, kmax)
    33. A(y, kmax) = s
    34. Next
    35. z = merk(k)
    36. merk(k) = merk(kmax)
    37. merk(kmax) = z
    38. End If
    39. For y = k + 1 To n
    40. s = A(y, k) / A(k, k) ' überlaufstelle
    41. A(y, k) = 0#
    42. For z = k + 1 To n + 1
    43. A(y, z) = A(y, z) - s * A(k, z)
    44. Next
    45. Next
    46. Next


    keine ahnung, ob das ausreicht, um mir weiterzuhelfen, falls nicht, setze ich noch mehr rein.
    ich dachte mir irgendwie so, dass ich einfach eine if-then-bedingung einbaue, so ungefähr "wenn dieses array den wertebereich übersteigt, dann:
    msgbox "[...]" und end, ansonsten: weiter fortfahren.

    ist leider leichter gesagt als getan. kann mir jemand behilflich sein?
    danke

    Edit by Manschula: Thema verschoben

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Blauarschbube666“ ()

    RodFromGermany schrieb:

    Poste bitte mal die genaue Fehlermeldung.
    Laufzeitfehler '6':
    Überlauf

    gelbe markierung an besagter stelle

    Bahaoth schrieb:

    kann es sein das A(k,k)
    an der Stelle = 0 wird?
    könnte sein; kommt den bei division durch null auch laufzeitfehler 6?

    ich hatte das problem schon, wenn ich andere variable eingelesen habe und da habe ich dann unter das letzte next runtergesetzt:

    Visual Basic-Quellcode

    1. If A(n, n) = 0 Then
    2. MsgBox "Dieses Gleichungssystem ist nicht oder nicht eindeutig lösbar."
    3. End
    4. else
    5. [weiterer subverlauf]


    und das hat dann auch funktioniert. allerdings kommt bei einer anderen besonderer variablensituation (nämlich lineare abhängigkeit) genau dasselbe vor (siehe ersten post) und meine if-then-else-sache funktioniert nicht mehr.

    kann es sein, dass s zu einer zahl wird, die den wertebereich der variablen sprengt?

    ich könnte zu beginn natürlich den bereich erweitern, möchte es aber so machen, dass bei austreten aus dem wertebereich eine msgbox kommt.
    oder will ich etwas unmögliches?^^ hab davon keine ahnung

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Blauarschbube666“ ()

    Blauarschbube666 schrieb:

    s = A(y, k) / A(k, k) ' überlaufstelle
    Deutet darauf hin, dass das Ergebnis die kleinstmögliche Double-Zahl (4,94065645841246544E-324) unterschreitet.

    Abfangen kannst du in VBA mit einem "On Error"-Statement.
    Variante1 :

    Visual Basic-Quellcode

    1. For ...
    2. On Error Resume Next
    3. s = A(y, k) / A(k, k)
    4. If Err.Number <> 0 Then
    5. MsgBox Err.Description
    6. Exit Sub
    7. End If
    8. On Error Goto 0
    9. Next

    Variante 2:

    Visual Basic-Quellcode

    1. Private Function TryDivision (ByVal Dividend as Double, Divisor as Double, Optional ByRef Result as Double) as Long
    2. On Error Resume Next
    3. Result = Dividend / Divisor
    4. TryDivision = Err.Number
    5. End Function
    6. ...
    7. 'HauptProgramm:
    8. ...
    9. For ...
    10. If TryDivision (A(y,k), A(k,k), s) <> 0 Then
    11. MsgBox "Fehler"
    12. Exit Sub
    13. End If
    14. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    picoflop schrieb:

    Blauarschbube666 schrieb:

    dass mein threadtitel falsch ist oder dass ich hier komplett im falschen bereich bin?

    Dein PREFIX (VB 2010) WAR falsch und du WARST im falschen Unterforum. So was kommt vor. Dafür hat ein Mod dich verschoben und den Prefix angepasst ;)
    verdammt, sorry leute :S
    danke an den mod^^

    petaod schrieb:

    Blauarschbube666 schrieb:

    s = A(y, k) / A(k, k) ' überlaufstelle
    Deutet darauf hin, dass das Ergebnis die kleinstmögliche Double-Zahl (4,94065645841246544E-324) unterschreitet.

    Abfangen kannst du in VBA mit einem "On Error"-Statement.
    Variante1 :

    Visual Basic-Quellcode

    1. For ...
    2. On Error Resume Next
    3. s = A(y, k) / A(k, k)
    4. If Err.Number <> 0 Then
    5. MsgBox Err.Description
    6. Exit Sub
    7. End If
    8. On Error Goto 0
    9. Next

    Variante 2:

    Visual Basic-Quellcode

    1. Private Function TryDivision (ByVal Dividend as Double, Divisor as Double, Optional ByRef Result as Double) as Long
    2. On Error Resume Next
    3. Result = Dividend / Divisor
    4. TryDivision = Err.Number
    5. End Function
    6. ...
    7. 'HauptProgramm:
    8. ...
    9. For ...
    10. If TryDivision (A(y,k), A(k,k), s) <> 0 Then
    11. MsgBox "Fehler"
    12. Exit Sub
    13. End If
    14. Next
    zum teufel, ja!
    danke dir :D
    dank an alle hier^^