Datentyp: POINTER TO
Ein Pointer speichert zur Laufzeit die Speicheradresse von Objekten wie beispielsweise Variablen oder Funktionsbaustein-Instanzen.
Syntax der Pointer-Deklaration:
<pointer name>: POINTER TO <data type> | <data unit type> | <function block name> ;
FUNCTION_BLOCK FB_Point VAR piNumber: POINTER TO INT; iNumber1: INT := 5; iNumber2: INT; END_VAR piNumber := ADR(iNumber1); // piNumber is assigned to address of iNumber1 iNumber2 := piNumber^; // value 5 of iNumber1 is assigned to variable iNumber2 by dereferencing of pointer piNumber
Einen Pointer zu dereferenzieren bedeutet, den Wert zu erhalten, auf den der Pointer zeigt. Ein Pointer wird dereferenziert, indem der Inhaltsoperator ^
an den Pointer-Bezeichner angehängt wird, beispielsweise piNumber^
im oben gezeigten Beispiel. Um einem Pointer die Adresse eines Objekts zuzuweisen, wird auf das Objekt der Adressoperator ADR
angewendet: ADR(iNumber1)
Im Onlinebetrieb können Sie mit demGehe zu Referenzvon einem Pointer zur Deklarationsstelle des referenzierten Objekts springen.
Wichtig
Wenn ein Pointer auf einen E/A-Eingang zeigt, gilt der Zugriff als schreibender Zugriff. Dies führt bei der Codeerzeugung zur Compilerwarnung ' <pointer name > ' ist kein gültiges Zuordnungsziel. Beispiel: pwInput := ADR(wInput);
Wenn Sie ein Konstrukt dieser Art benötigen, müssen Sie den Eingangswert (wInput
) zuerst auf eine Variable mit Schreibzugriff kopieren.
Indexzugriff auf Pointer
CODESYS erlaubt den Indexzugriff []
auf Variablen vom Typ POINTER TO
, ebenso wie auf die Datentypen STRING
oder WSTRING
.
Auf die Daten, auf die der Pointer zeigt, kann auch zugegriffen werden, indem der Klammeroperator []
an den Pointer-Bezeichner angehängt wird, beispielsweise piData[i]
. Der Basisdatentyp des Pointers bestimmt den Datentyp und die Größe der indizierten Komponente. Der Indexzugriff auf den Pointer erfolgt dabei arithmetisch, indem zur Adresse des Pointers der indexabhängige Offset i * SIZEOF( <base type> )
addiert wird. Gleichzeitig wird der Pointer implizit dereferenziert.
Berechnung:
piData[i] := (piData + i * SIZEOF(INT))^;
Das ist nicht:
piData[i] != (piData + i)^;
Indexzugriff STRING
Wenn Sie den Indexzugriff bei einer Variablen vom Typ STRING
verwenden, erhalten Sie das Zeichen am Offset des Indexausdrucks. Das Ergebnis ist vom Typ BYTE
. Beispielsweise gibt sData[i]
das i-te Zeichen der Zeichenkette sData
als SINT
(ASCII) zurück.
Indexzugriff WSTRING
Wenn Sie den Indexzugriff bei einer Variablen vom Typ WSTRING
verwenden, erhalten Sie das Zeichen am Offset des Indexausdrucks. Das Ergebnis ist vom Typ WORD
. Beispielsweise gibt wsData[i]
das i-te Zeichen der Zeichenkette als INT
(Unicode) zurück.
Tipp
Referenzen und Pointer auf BIT
-Variablen sind ungültige Deklarationen, ebenso wie Arraykomponenten mit Basistyp BIT
.
Pointer subtrahieren
Das Ergebnis der Differenz zweier Pointer ist ein Wert vom Typ DWORD
, auch auf64-Bit-Plattformen, wenn die Pointer 64-Bit-Pointer sind.
Tipp
Die Verwendung von Referenzen hat den Vorteil dass Typsicherheit garantiert ist. Das ist bei Pointern nicht der Fall.
Tipp
Der Speicherzugriff von Pointern während der Laufzeit kann durch die implizite Überwachungsfunktion CheckPointer
geprüft werden.