データ型:POINTER TO
ポインタは、実行時に変数や関数ブロックインスタンスなどのオブジェクトのメモリアドレスを格納します。
ポインタ宣言の構文:
<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
ポインターの間接参照は、ポインターが指す値を取得することを意味します。コンテンツ演算子を追加することにより、ポインターが逆参照されます ^
ポインタ識別子へ(例:、 piNumber^
上記の例では)。オブジェクトのアドレスをポインタに割り当てるには、アドレス演算子 ADR
オブジェクトに適用されます: ADR(iNumber1)
。
オンラインモードでは、次を使用できます 参照に移動 ポインタから参照変数の宣言位置にジャンプします。
重要
ポインタがI / O入力を指す場合、書き込みアクセスが適用されます。コードが生成されると、これはコンパイラの警告につながります '<ポインタ名>'は有効な割り当てターゲットではありません。例: pwInput := ADR(wInput);
この種の構成が必要な場合は、最初に入力値をコピーする必要があります(wInput
)書き込みアクセス権を持つ変数に。
ポインタへのインデックスアクセス
CODESYS インデックスアクセスを許可します []
タイプの変数に POINTER TO
、およびデータ型 STRING
また WSTRING
。
ポインタが指すデータには、角かっこ演算子を追加してアクセスすることもできます。 []
ポインタ識別子へ(たとえば、 piData[i]
)。ポインタの基本データ型によって、インデックス付きコンポーネントのデータ型とサイズが決まります。この場合、ポインタへのインデックスアクセスは、インデックスに依存するオフセットを追加することによって算術的に行われます。 i * SIZEOF(<base type>)
ポインタのアドレスに。ポインタは同時に暗黙的に逆参照されます。
計算:
piData[i] := (piData + i * SIZEOF(INT))^;
それはそうではありません いいえ:
piData[i] != (piData + i)^;
インデックスアクセス STRING
タイプの変数でインデックスアクセスを使用する場合 STRING
、インデックス式のオフセットで文字を取得します。結果はタイプです BYTE
。例えば、 sData[i]
文字列のi番目の文字を返します sData
なので SINT
(ASCII)。
インデックスアクセス WSTRING
タイプの変数でインデックスアクセスを使用する場合 WSTRING
、インデックス式のオフセットで文字を取得します。結果はタイプです WORD
。例えば、 wsData[i]
文字列のi番目の文字を次のように返します INT
(Unicode)。
ヒント
への参照とポインタ BIT
変数は 無効 宣言、および基本型の配列要素 BIT
。
ポインタを引く
2つのポインターの違いの結果は、タイプの値です。 DWORD
、ポインターが64ビットポインターの場合、64ビットプラットフォームでも。
ヒント
参照を使用すると、型の安全性が保証されるという利点があります。ポインタの場合はそうではありません。
ヒント
ポインタのメモリアクセスは、暗黙的な監視機能によって実行時にチェックできます。 CheckPointer
。