Wie kann ich das Auftreten der Fehlermeldung System.IndexOutOfRangeException verhindern ?

  • VB.NET
  • .NET 5–6

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Naifu.

    Wie kann ich das Auftreten der Fehlermeldung System.IndexOutOfRangeException verhindern ?

    Eines der Unterprogramme von dem Programm was ich in dem Beitrag : For Next Schleifen lassen sich nicht ersetzen - SonstigeProblemstellungen - VB-Paradise 2.0 – Die große Visual-Basic- und.NET-Community veröffentlicht habe verursacht manchmal, wenn es aufgerufen wird die Fehlermeldung System.IndexOutOfRangeException

    In einer der Visual script Varianten, die ich geschrieben hatte, war es mir gelungen, eine Version des Programms zu erstellen, bei der man in der Ausgabe gut sehen kann, wie das Programm funktioniert. :

    Visual Basic-Quellcode

    1. dim a,P,k,x,Ausg,Erg
    2. a=Inputbox("Bitte geben sie die Basis ein:",_
    3. "b=a mod c")
    4. P=Inputbox("Bitte geben sie die Potenz ein:",_
    5. "b=a mod c:")
    6. k=Inputbox("Bitte geben sie den Teiler K ein:",_
    7. "b=a mod c:")
    8. redim Produkt(P+1) 'Feld anlegen
    9. Produkt(0)= a 'initialisieren
    10. For x= 0 to P
    11. Produkt(x+1)=(Produkt(x)*a)
    12. mod k
    13. if x > 0 then
    14. Ausg = Ausg + "
    15. Innerhalb der Schleife " & " x : " & x & " Produkt(x) : "_
    16. & Produkt(x) & " = (" & Produkt(x-1) & " mal " & a & ") mod " & K & Chr(13)
    17. end if
    18. next
    19. Erg = Produkt(P-1)
    20. Msgbox Ausg & Chr(13) & " Ergebnis = " & Erg


    Wenn man in diesem Script eine einfache Zahlenkombination wie zum Beispiel 6 hoch 4 mod 150 eingibt , kann man sehr gut nachvollziehen, wie dieses Script das Ergebnis berechnet.

    Was habe ich bisher selbst versucht, um das Problem zu beheben ?

    Ich habe die Deklaration des Feldes :

    Visual Basic-Quellcode

    1. Static Produkt(pot+10)

    erhöht. Ich glaube aber, dass es nur wichtig ist, dass das Feld Produkt mindestens so groß wie Pot dimensioniert wird, weil am Ende der Funktion nur

    VB.NET-Quellcode

    1. Produkt(pot–1)
    zurückgegeben wird. Dann habe ich zum Beispiel versucht von der Seite : RSA-Kryptosystem– Wikipedia eine Funktion, die
    das gleiche macht wie meine :

    C-Quellcode

    1. int modularPower(int a, int b, int n)
    2. {
    3. int result = 1;
    4. for (int i = 0; i < b; i++)
    5. {
    6. result *= a;
    7. result %= n;
    8. }
    9. return result;
    10. }

    mittels des Link : Code Converter C# to VB and VB to C# – Telerik

    von der Programmiersprache C in VB zu übersetzen. Leider erhalte ich beim Versuch der Übersetzung eine Fehlermeldung. Dann habe ich mir auch den Link : IndexOutOfRangeException
    Klasse (System) | Microsoft Docs
    angeguckt, aus den Hinweisen die dort gegeben werden, werde ich nicht schlau, in Bezug auf das, was ich bei diesem kleinen Programm verändern muss, um das Auftreten dieser Fehlermeldung zu verhindern ?

    Kann mir jemand für dieses kleine Programm :

    VB.NET-Quellcode

    1. Function
    2. ModbermitPotenz(m, pot, N) 'Unterprogramm zur Ausführung von Mod Berechnungen für Zahlen mit Potenzen
    3. Static x,y, Z As Integer
    4. Static Produkt(pot+10 )'Feld anlegen
    5. Produkt(0) = m 'initialisieren
    6. For x =0 To pot
    7. y=(Produkt(x) * m)
    8. Z= y Mod N
    9. Produkt(x+1)= Z
    10. Next
    11. Return Produkt(pot- 1)


    Veränderungsvorschläge machen um das Problem zu beheben ?
    ähm - ich hab nichtmal verstanden, welche Programmiersprache gewünscht ist: vb.net, vbscript, c, oder nochwas anderes?

    jedenfalls was bei dir mit "dieses kleine Programm" überschrieben ist ist keine mir bekannte Programmiersprache.

    Sollemer vielleicht was bei dir mit "das gleiche macht wie meine" überschrieben ist nach vb.net übersetzen? das sieht mir nicht so schwierig aus.
    Ich weis gar nicht mehr als ich in Visual Studio das Projekt gestartet hatte, ob ich als Projekt Typ : Windows Form App (.Net Framework) Visual Basic oder nur Windows Forms App Visual basic ausgewählt hatte. ich vermute, weil in dem Programm der Anfang

    VB.NET-Quellcode

    1. ​Public Class Form1
    lautet. und das Ende

    VB.NET-Quellcode

    1. ​End Class
    lautet. Das es VB Net code ist.
    Von daher hätte ich die Function

    C-Quellcode

    1. ​int modularPower(int a, int b, int n)
    auch gerne in VB Net übersetzt. Das bietet die Seite : Code Converter C# to VB and VB to C# – Telerik ja auch an.
    Wenn ich den Code in das linke Fenster einfüge, kann ich im rechten Fenster unter anderem lesen : " Cannot convert ExpressionStatementSyntax. " Noch besser fände ich es, wenn ich den Fehler innerhalb des Programms :

    VB.NET-Quellcode

    1. ​ ModbermitPotenz(m, pot, N)
    finden könnte.
    Moin Ioosm,
    Du solltest dringend an deinen Problem-Beschreibungen arbeiten.
    Die Fehlermeldung kommt gar nicht aus deinem Code, Richtig?
    Ich versuch mal das zu Übersetzen:

    C-Quellcode

    1. int modularPower(int a, int b, int n)
    2. {
    3. int result = 1;
    4. For (int i = 0; i < b; i++)
    5. {
    6. result *= a;
    7. result %= n;
    8. }
    9. Return result;
    10. }

    VB.NET-Quellcode

    1. Public Function ModularPower(a As Integer, b As Integer, n As Integer)
    2. Dim result As Integer = 1
    3. For i As Integer = 0 To b - 1
    4. result *= a
    5. result = result Mod n
    6. Next
    7. Return result
    8. End Function
    Es funktioniert, ich war einfach etwas zu irritiert von dem vielen
    Text den die Seite : Code Converter C# to VB and VB to C# – Telerik bei der Übersetzung produziert hat. Natürlich hätte ich mich noch
    mehr gefreut, wenn ich in dem anderen Programm den Fehler gefunden hätte. Aber so ist es auch gut. Vielen Dank für die Hilfe.
    Habe das mal etwas angepasst.
    Keine Ahnung wo dein Problem liegt.

    VB.NET-Quellcode

    1. Public Function ModularPower(a As Integer, b As Integer, n As Integer)
    2. Dim result As Integer = 1
    3. For i As Integer = 0 To b - 1
    4. result *= a
    5. result = result Mod n
    6. Next
    7. Return result
    8. End Function
    9. Function ModbermitPotenz(m, pot, N) 'Unterprogramm zur Ausführung von Mod Berechnungen für Zahlen mit Potenzen
    10. Dim x, y, Z As Integer
    11. Dim Produkt(pot) 'Feld anlegen
    12. Produkt(0) = m 'initialisieren
    13. For x = 0 To pot - 1
    14. y = (Produkt(x) * m)
    15. Z = y Mod N
    16. Produkt(x + 1) = Z
    17. Next
    18. Return Produkt(pot - 1)
    19. End Function

    Kommt beides mal 96 bei raus.
    Wozu bauchts so was?
    Bei dem Programm : ModbermitPotenz liegt das Problem darin, das es nur manchmal die Fehlermeldung System.IndexOutOfRangeException produziert.
    Es ist ein wenig seltsam, manchmal in der einen Anwendung eingesetzt funktioniert es einwandfrei, in einer anderen passiert die Fehlermeldung System.IndexOutOfRangeException öfter.
    Ich hatte ein mathematisches Spielzeug programmiert welches den Zweck hat für das RSA Verschlüsselungsverfahren die Entstehung der Schlüsselpaare,
    welche man zur ver und Entschlüsselung braucht, vorzuführen. Dabei brauch man diese Mod Berechnungen. Das Programm ModermitPotenz war mir deshalb so lieb, weil ich mir mit Hilfe des Scriptes am Anfang dieses Beitrages, klar machen konnte wie es funktioniert. Es produziert auf den input : 6,4,150 den folgenden Output :
    innerhalb der Schleife X : 1 Produkt(x) : 36 = ( 6 mal 6 ) mod 150
    innerhalb der Schleife X : 2 Produkt(x) : 66 = ( 36 mal 6 ) mod 150
    innerhalb der Schleife X : 3 Produkt(x) : 96 = (66 mal 6 ) mod 150
    innerhalb der Schleife X : 4 Produkt(x) : 126 = (96 mal 6 ) mod 150

    Ergebnis = 96
    Bei dem Programm ModularPower werde ich mir das Verständnis erst noch aneignen müssen.

    loosm schrieb:

    das es nur manchmal die Fehlermeldung System.IndexOutOfRangeException produziert

    Also diese Fehlermeldung sagt dir dass du in deinem Array ein Element abfragst, dass nicht mehr vom Array umschlossen wird.

    Dim Produkt(pot) ist ein Array mit pot vielen Elementen. Der Index geht also von 0 bis pot-1
    Wenn da ein Index in Produkt() gesetzt wird, der größer als pot-1 ist, dann gibts den Fehler. IndexOutOfRange.

    Also eigentlich sehr verständlich Index geht rein, Range ist der Platz, der verfügbar ist.
    Vielen Dank, ihre Antwort hat mich nochmal auf eine Idee gebracht, innerhalb der Function ModbermitPotenz zu schreiben :

    VB.NET-Quellcode

    1. ​Dim Produkt(pot) as Ulong
    anstatt zu schreiben :

    VB.NET-Quellcode

    1. Dim Produkt(pot)
    Ich habe es getestet und es hat nicht funktioniert. Mittlerweile habe ich ModularPower debuggt und festgestellt, das beide Programme zu den gleichen Zwischenergebnissen kommen, weil sie die gleiche Technik verwenden : Immer im Wechsel multiplizieren und dann das Ergebnis Mod berechnen. Nur mit dem Unterschied das ModularPower ohne eine Feld Deklaration auskommt. Von daher bin ich mit dem Programm ModularPower ganz zufrieden.
    Von daher bin ich mit dem Programm ModularPower ganz zufrieden.​

    Schön das es dir zusagt.
    Ich würde mich, wie Jeder der einen hilfreichen Beitrag beigesteuert hat, über ein "Hilfreich" freuen. ;)