Skip to main content

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.