Skip to main content

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.