Skip to main content

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.