ARRAY Index aus der Dimensionierung wird überschritten.

Anonymous
2016-02-05
2016-02-10
  • Anonymous - 2016-02-05

    Originally created by: mg

    Hallo Leute

    Wenn nun durch meine Dummheit mal der Index eines Array ÜBER und UNTER die Definitionsgrenzen hinausläuft und dann von dort Daten gelesen oder gar dorthin geschrieben werden, WELCHE DATEN WERDEN GELESEN und WO SCHREIBT DIE STEUERUNG HIN. Lt meinen Erfahrungen werden die Grenze nicht abgefragt. (werde ich in Zukunft EXPLIZIT jedes mal machen). Es soll da ja eine Funktion Checkbounds geben, aber die habe ich bisher nie verwendet. Hatte auch noch nie eine derart verzwickte Situation. ODER kann man einen Parameter setzen, daß die Steuerung bei einem derartigen Fehler GEKILLT wird. Lt. meine Erfahrungen führt das zu den selben Fehlern wie ein verbogener Pointer. totale Katastrophe.

    Mit bestem Dank
    Mg

    Nachtrag:
    - Bachmann MX207 schreibt beim UNTERSCHREITEN auf irgendeine Speicherzelle innerhalb des Array (bei eindimensionalen Arrays)
    ... schreibt beim ÜBERSCHREITEN irgendwohin im gesamten Speicherabbild (außerhalb des dimensionierten Bereichs)
    Nachtrag zum Nachtrag: sieht nur so aus. Der Zugriff ist eher undefiniert.
    - Wago 750-880 irgendwohin im gesamten Speicherabbild (außerhalb des dimensionierten Bereichs)
    - Wago 758-874 irgendwohin im gesamten Speicherabbild (außerhalb des dimensionierten Bereichs)

     
  • HeHo - 2016-02-10

    Hallo, auszug aus der CoDeSys-Hilfe

    Zitat:
    Funktion Checkbounds
    Wenn Sie in Ihrem Projekt eine Funktion mit Namen CheckBounds definieren, können Sie damit Bereichsüberschreitungen in Arrays automatisch überprüfen! Der Name der Funktion ist festgelegt und darf nur diese Bezeichnung besitzen.
    Beispiel für die Funktion CheckBounds:
    FUNCTION CheckBounds : DINT
    VAR_INPUT
    index, lower, upper: DINT;
    END_VAR
    IF index < lower THEN
    CheckBounds := lower;
    ELSIF index > upper THEN
    CheckBounds := upper;
    ELSE CheckBounds := index;
    END_IF
    Das folgende Beispielprogramm zum Testen der CheckBounds-Funktion greift außerhalb der Grenzen eines definierten Arrays zu. Die Funktion CheckBounds gewährleistet, dass der Wert TRUE nicht an die Stelle A[10], sondern an der oberen noch gültigen Bereichsgrenze A[7] zugewiesen wird. Mit der CheckBounds-Funktion können somit Zugriffe außerhalb von Array-Grenzen korrigiert werden.
    Test Programm für die CheckBounds Funktion:
    PROGRAM PLC_PRG
    VAR
    a: ARRAY[0..7] OF BOOL;
    b: INT:=10;
    END_VAR
    a[b]:=TRUE;
    Achtung: Die in der CheckLib enthaltene CheckBounds-Funktion ist eine Beispiellösung! Prüfen Sie vor Verwendung der Bibliothek, ob die Funktion in Ihrem Sinne arbeitet oder implementieren Sie eine entsprechende CheckBounds-Funktion als Baustein direkt in Ihrem Projekt.

    Gruß

     

    Related

    Talk.ru: 7


Log in to post a comment.