Skip to main content

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.