Tipo di dati: POINTER TO
Un puntatore memorizza l'indirizzo di memoria di oggetti, come variabili o istanze di blocchi funzione, in fase di esecuzione.
Sintassi della dichiarazione del puntatore:
<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
Dereferenziare un puntatore significa ottenere il valore a cui punta il puntatore. Un puntatore viene dereferenziato aggiungendo l'operatore contenuto ^
all'identificatore del puntatore (esempio:, piNumber^
nell'esempio sopra). Per assegnare l'indirizzo di un oggetto a un puntatore, l'operatore address ADR
si applica all'oggetto: ADR(iNumber1)
.
In modalità online, puoi usare Vai al riferimento per passare da un puntatore alla posizione di dichiarazione della variabile di riferimento.
Importante
Quando un puntatore punta a un ingresso I/O, si applica l'accesso in scrittura. Quando il codice viene generato, ciò porta all'avviso del compilatore '<nome puntatore>' non è una destinazione di assegnazione valida. Esempio: pwInput := ADR(wInput);
Se hai bisogno di un costrutto di questo tipo, devi prima copiare il valore di input (wInput
) a una variabile con accesso in scrittura.
Indice di accesso ai puntatori
CODESYS consente l'accesso all'indice []
a variabili di tipo POINTER TO
, nonché ai tipi di dati STRING
o WSTRING
.
È possibile accedere ai dati a cui punta il puntatore anche aggiungendo l'operatore parentesi []
all'identificatore del puntatore (ad esempio, piData[i]
). Il tipo di dati di base del puntatore determina il tipo di dati e la dimensione del componente indicizzato. In questo caso, l'accesso dell'indice al puntatore viene eseguito aritmeticamente aggiungendo l'offset dipendente dall'indice i * SIZEOF(<base type>)
all'indirizzo del puntatore. Il puntatore viene dereferenziato in modo implicito allo stesso tempo.
Calcolo:
piData[i] := (piData + i * SIZEOF(INT))^;
Quello non è non:
piData[i] != (piData + i)^;
Accesso all'indice STRING
Quando si utilizza l'accesso all'indice con una variabile del tipo STRING
, ottieni il carattere all'offset dell'espressione di indice. Il risultato è di tipo BYTE
. Per esempio, sData[i]
restituisce l'i-esimo carattere della stringa sData
come SINT
(ASCII).
Accesso all'indice WSTRING
Quando si utilizza l'accesso all'indice con una variabile del tipo WSTRING
, ottieni il carattere all'offset dell'espressione di indice. Il risultato è di tipo WORD
. Per esempio, wsData[i]
restituisce l'i-esimo carattere della stringa come INT
(Unicode).
Suggerimento
Riferimenti e puntatori a BIT
le variabili sono non valido dichiarazioni, nonché elementi di matrice con tipo base BIT
.
Puntatori di sottrazione
Il risultato della differenza tra due puntatori è un valore di tipo DWORD
, anche su piattaforme a 64 bit quando i puntatori sono puntatori a 64 bit.
Suggerimento
L'uso dei riferimenti offre il vantaggio di garantire la sicurezza del tipo. Questo non è il caso dei puntatori.
Suggerimento
L'accesso alla memoria dei puntatori può essere verificato in runtime dalla funzione di monitoraggio implicito CheckPointer
.