Type de données : POINTER TO
Un pointeur stocke l'adresse mémoire d'objets tels que des variables ou des instances de bloc fonction au moment de l'exécution.
Syntaxe de déclaration de pointeur :
<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
Déréférencer un pointeur signifie obtenir la valeur pointée par le pointeur. Un pointeur est déréférencé par l'opérateur de contenu ^
ajouté à l'identifiant du pointeur, par exemple piNumber^
dans l'exemple ci-dessus. Pour affecter l'adresse d'un objet à un pointeur, l'opérateur d'adresse est appliqué à l'objet ADR
appliqué: ADR(iNumber1)
En mode en ligne, vous pouvez utiliser leAller à la référencesauter d'un pointeur au point de déclaration de l'objet référencé.
Important
Si un pointeur pointe sur une entrée d'E/S, l'accès est considéré comme un accès en écriture. Cela conduit à un avertissement du compilateur lors de la génération de code '<nom du pointeur>' n'est pas une cible d'allocation valide. Exemple: pwInput := ADR(wInput);
Si vous avez besoin d'une construction de ce type, vous devez utiliser la valeur d'entrée (wInput
) d'abord à une variable avec accès en écriture.
Indexer l'accès aux pointeurs
CODESYS permet l'accès à l'index []
sur des variables de type POINTER TO
, ainsi que sur les types de données STRING
ou WSTRING
.
Les données pointées par le pointeur sont également accessibles à l'aide de l'opérateur parenthèse []
ajouté à l'identifiant du pointeur, par exemple piData[i]
. Le type de données de base du pointeur détermine le type de données et la taille du composant indexé. L'accès à l'index du pointeur s'effectue arithmétiquement en ajoutant le décalage dépendant de l'index à l'adresse du pointeur i * SIZEOF( <base type> )
est ajouté. Dans le même temps, le pointeur est implicitement déréférencé.
Calcul:
piData[i] := (piData + i * SIZEOF(INT))^;
C'est-à-dire ne pas:
piData[i] != (piData + i)^;
accès aux index STRING
Si vous souhaitez accéder à l'index pour une variable de type STRING
vous obtenez le caractère au décalage de l'expression d'index. Le résultat est de type BYTE
. Par exemple là sData[i]
le i-ième caractère de la chaîne de caractères sData
comme SINT
(ASCII) retour.
accès aux index WSTRING
Si vous souhaitez accéder à l'index pour une variable de type WSTRING
vous obtenez le caractère au décalage de l'expression d'index. Le résultat est de type WORD
. Par exemple là wsData[i]
le i-ème caractère de la chaîne comme INT
(Unicode) retour.
Astuce
Références et pointeurs vers BIT
les variables sont non valide déclarations, ainsi que des éléments de tableau avec type de base BIT
.
Soustraire des pointeurs
Le résultat de la différence entre deux pointeurs est une valeur de type DWORD
, même sur les plateformes 64 bits si les pointeurs sont des pointeurs 64 bits.
Astuce
L'utilisation de références présente l'avantage de garantir la sécurité du type. Ce n'est pas le cas des pointeurs.
Astuce
L'accès à la mémoire par des pointeurs pendant l'exécution peut être contrôlé par la fonction de surveillance implicite CheckPointer
en cours de vérification.