Tipo de datos: POINTER TO
Un puntero almacena la dirección de memoria de objetos, como variables o instancias de bloques de funciones, en tiempo de ejecución.
Sintaxis de la declaración del puntero:
<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
Desreferenciar un puntero significa obtener el valor al que apunta el puntero. Se elimina la referencia de un puntero agregando el operador de contenido ^
al identificador del puntero (ejemplo:, piNumber^
en el ejemplo anterior). Para asignar la dirección de un objeto a un puntero, el operador de dirección ADR
se aplica al objeto: ADR(iNumber1)
.
En el modo en línea, puede utilizar Ir a la referencia para saltar desde un puntero a la ubicación de la declaración de la variable referenciada.
Importante
Cuando un puntero apunta a una entrada de E/S, se aplica el acceso de escritura. Cuando se genera el código, esto lleva a la advertencia del compilador '<nombre del puntero>' no es un objetivo de asignación válido. Ejemplo: pwInput := ADR(wInput);
Si necesita una construcción de este tipo, primero debe copiar el valor de entrada (wInput
) a una variable con acceso de escritura.
Índice de acceso a punteros
CODESYS permite el acceso al índice []
a variables de tipo POINTER TO
, así como a los tipos de datos STRING
o WSTRING
.
También se puede acceder a los datos, a los que apunta el puntero, agregando el operador de paréntesis []
al identificador del puntero (por ejemplo, piData[i]
). El tipo de datos base del puntero determina el tipo de datos y el tamaño del componente indexado. En este caso, el acceso de índice al puntero se realiza aritméticamente agregando el desplazamiento dependiente del índice i * SIZEOF(<base type>)
a la dirección del puntero. El puntero se desreferencia implícitamente al mismo tiempo.
Cálculo:
piData[i] := (piData + i * SIZEOF(INT))^;
Eso no es no:
piData[i] != (piData + i)^;
Acceso al índice STRING
Cuando utiliza el acceso de índice con una variable del tipo STRING
, obtiene el carácter en el desplazamiento de la expresión de índice. El resultado es de tipo BYTE
. Por ejemplo, sData[i]
devuelve el i-ésimo carácter de la cadena sData
como SINT
(ASCII).
Acceso al índice WSTRING
Cuando utiliza el acceso de índice con una variable del tipo WSTRING
, obtiene el carácter en el desplazamiento de la expresión de índice. El resultado es de tipo WORD
. Por ejemplo, wsData[i]
devuelve el i-ésimo carácter de la cadena como INT
(Unicódigo).
Sugerencia
Referencias y punteros a BIT
las variables son inválido declaraciones, así como elementos de matriz con tipo base BIT
.
Restar punteros
El resultado de la diferencia entre dos punteros es un valor de tipo DWORD
, incluso en plataformas de 64 bits cuando los punteros son punteros de 64 bits.
Sugerencia
El uso de referencias ofrece la ventaja de garantizar la seguridad de los tipos. Ese no es el caso con los punteros.
Sugerencia
El acceso a la memoria de los punteros se puede verificar en tiempo de ejecución mediante la función de monitoreo implícita CheckPointer
.