ich habe mal eine Frage bezüglich der Pointerbenutzung. Ich habe ein Funktionsbaustein, der als Eingabe den Typ POINTER TO ARRAY [0..231] OF BYTE fordert. In diesem FB wird das gesamte Array mit Werten beschrieben.
Wenn ich nun mein FB ein Pointer übergebe, der auf eine **kleineres Array ** zeigt bekomm ich Probleme, da der FB auf Elemente zugreift, die nicht im Array liegen, dadurch nehmen unter Umstände andere Variablen diesen Wert an. Wie kann ich dies verhindern? Geht dieses überhaupt, ohne die Länge des Arrays dem FB mitzuteilen?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Danke für die Antwort! Dann werd ich wohl einfach ein Array als Schnittstelle nehmen, da kann es nicht passieren, dass man bei der Anwendung ein kleineren Arraygröße übergibt!
Gruß Beckx-Net
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Zitat:
Wie kann ich dies verhindern? Geht dieses überhaupt, ohne die Länge des Arrays dem FB mitzuteilen?
Es gibt die Funktion CheckBounds. Diese musst du selbst erstellen, sie wird aber automatisch bei Zugriffen außerhalb deines def. Feldes aufgerufen.
Aus der CoDeSys Hilfe (einfach CheckBounds suchen)
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.
Außerdem kannst du, um mit Pointern als Übergabewert zu arbeiten, den Array einfach als IN_OUT Variable deklarieren. Dies hat zur Folge, dass bei dem Aufruf deiner Instanz es unbedingt erforderlich ist, diesen Wert zu übergeben. Sonst meckert der Compiler, du kannst nur den gleichen Typen übergeben und du verbrätst nicht zuviel Speicher, da dies auch nur als Zeiger gehandelt wird.
Hallo,
ich habe mal eine Frage bezüglich der Pointerbenutzung. Ich habe ein Funktionsbaustein, der als Eingabe den Typ POINTER TO ARRAY [0..231] OF BYTE fordert. In diesem FB wird das gesamte Array mit Werten beschrieben.
Wenn ich nun mein FB ein Pointer übergebe, der auf eine **kleineres Array ** zeigt bekomm ich Probleme, da der FB auf Elemente zugreift, die nicht im Array liegen, dadurch nehmen unter Umstände andere Variablen diesen Wert an. Wie kann ich dies verhindern? Geht dieses überhaupt, ohne die Länge des Arrays dem FB mitzuteilen?
Hallo,
nein, bei einer Pointerübergabe muß die Stelle, die den Pointer nutzt, auch den Inhalt dahinter kennen, d.h. auch die Grösse des arrays.
Bei der Benutzung von Pointern muss der Programmierer nun mal wissen was er tut.
Danke für die Antwort! Dann werd ich wohl einfach ein Array als Schnittstelle nehmen, da kann es nicht passieren, dass man bei der Anwendung ein kleineren Arraygröße übergibt!
Gruß Beckx-Net
Hi,
Es gibt die Funktion CheckBounds. Diese musst du selbst erstellen, sie wird aber automatisch bei Zugriffen außerhalb deines def. Feldes aufgerufen.
Aus der CoDeSys Hilfe (einfach CheckBounds suchen)
Außerdem kannst du, um mit Pointern als Übergabewert zu arbeiten, den Array einfach als IN_OUT Variable deklarieren. Dies hat zur Folge, dass bei dem Aufruf deiner Instanz es unbedingt erforderlich ist, diesen Wert zu übergeben. Sonst meckert der Compiler, du kannst nur den gleichen Typen übergeben und du verbrätst nicht zuviel Speicher, da dies auch nur als Zeiger gehandelt wird.
Related
Talk.ru: 7
Danke,
es hat funktioniert!