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)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
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)
Hallo, auszug aus der CoDeSys-Hilfe
Gruß
Related
Talk.ru: 7