Variables (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Types de données, variables et constantes - Index


Une variable est un identificateur dont la valeur peut être modifiée à l'exécution. Exprimée différemment, une variable est le nom d'un emplacement mémoire ; le nom vous permet de lire ou d'écrire l'emplacement mémoire. Les variables sont comme des conteneurs de données qui, comme elles sont typées, peuvent indiquer au compilateur comment interpréter les données qu'elles contiennent.

Déclaration de variables

La syntaxe de base de la déclaration d'une variable est :

var identifierList:type;

identifierList est une liste d'identificateurs valides délimitée par des virgules et "type" un type valide. Par exemple,

 var I: Integer;

déclare une variable I de type Integer, et :

 var X, Y: Real;

déclare deux variables (X et Y) de type Real.

Dans des déclarations de variables consécutives, il n'est pas nécessaire de répéter le mot réservé var :

 var
    X, Y, Z: Double;
    I, J, K: Integer;
    Digit: 0..9;
    Okay: Boolean;

Les variables déclarées dans une procédure ou une fonction sont parfois appelées locales alors que les autres variables sont appelées globales. Les variables globales peuvent être initialisées lors de leur création en utilisant la syntaxe :

var identifier: type = constantExpression;

constantExpression est une expression constante représentant une valeur de type type. Ainsi, la déclaration :

 var I: Integer = 7;

est équivalente au code suivant :

 var I: Integer;
     ...
 I := 7;

Les variables locales ne peuvent pas être initialisées dans leurs déclarations. Une déclaration de plusieurs variables (de la forme var X, Y, Z: Real;) ne peut comporter d'initialisation, ni ne peut déclarer des variables de type fichier et variant.

Si vous n'initialisez pas explicitement une variable globale, le compilateur l'initialise à 0. Les données de l'instance d'un objet (champs) sont également initialisées à 0. Sur la plate-forme Win32, le contenu d'une variable locale est indéfini jusqu'à ce qu'une valeur lui soit assignée.

Quand vous déclarez une variable, vous allouez de la mémoire qui est libérée automatiquement quand la variable n'est plus utilisée. En particulier, les variables locales n'existent que jusqu'à ce que le programme sorte de la fonction ou de la procédure qui les a déclarées. Pour plus de détails sur les variables et la gestion de la mémoire, voir Gestion de la mémoire.

Adresses absolues

Vous pouvez créer une nouvelle variable placée à la même adresse qu'une variable existante. Pour cela, placez le mot absolute après le nom de type, dans la déclaration de la nouvelle variable, en le faisant suivre du nom d'une variable existante (déclarée précédemment). Par exemple,

 var
   Str: string[32];
   StrLen: Byte absolute Str;

spécifie que la variable StrLen doit commencer à la même adresse que Str. Comme le premier octet d'une chaîne courte contient la longueur de la chaîne, la valeur de StrLen est la longueur de Str.

Il n'est pas possible d'initialiser une variable dans une déclaration absolute, ni de combiner absolute avec d'autres directives.

Variables dynamiques

Il est possible de créer des variables dynamiques en appelant la procédure GetMem ou New. De telles variables sont allouées sur le tas et ne sont pas gérées automatiquement. Quand vous en créez une, c'est à vous de libérer la mémoire de la variable : utilisez FreeMem pour supprimer des variables créées par GetMem et Dispose pour supprimer des variables créées par New. D'autres routines standard agissent sur les variables dynamiques : ReallocMem, AllocMem, Initialize, Finalize, StrAlloc et StrDispose.

Les chaînes longues, les chaînes étendues, les tableaux dynamiques, les variants et les interfaces sont également des variables dynamiques allouées sur la pile, mais leur mémoire est gérée automatiquement.

Variables locales de thread

Les variables locales de thread (appelées aussi variables de thread) sont utilisées dans les applications multithreads. Une variable locale de thread est identique à une variable globale à cette différence que chaque thread d'exécution dispose de sa propre copie privée de la variable à laquelle les autres threads ne peuvent accéder. Les variables locales de thread sont déclarées avec le mot réservé threadvar au lieu de var. Par exemple,

 threadvar X: Integer;

Les déclarations de variables de thread

  • ne peuvent se faire dans une procédure ou une fonction.
  • ne peuvent contenir d'initialisation.
  • ne peuvent spécifier la directive absolute.

Les variables dynamiques qui sont habituellement gérées par le compilateur (chaînes longues, chaînes étendues, tableaux dynamiques, variants et interfaces) peuvent êtres déclarées par threadvar, mais le compilateur ne libérera pas automatiquement la mémoire allouée sur le tas créée par chaque thread d'exécution. Si vous utilisez ces types de données dans des variables de thread, c'est à vous de vous occuper de leur mémoire depuis le thread, avant la fin d'exécution du thread. Par exemple,

 threadvar S: AnsiString;
 S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   ...
 S := '';  // free the memory used by S

Remarque : L'emploi de telles constructions est déconseillé.

Vous pouvez libérer un variant en le définissant par Unassigned et une interface ou un tableau dynamique en le définissant par nil.

Voir aussi