115 votes

Les variables delphi sont-elles initialisées par une valeur par défaut ?

Je suis nouveau dans Delphi, et j'ai effectué quelques tests pour voir à quoi les variables d'objet et de pile sont initialisées par défaut :

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

C'est le comportement auquel je suis habitué dans d'autres langues, mais je me demande s'il est prudent de s'y fier dans Delphi ? Par exemple, je me demande si cela ne dépend pas d'un paramètre du compilateur, ou si cela ne fonctionne pas différemment sur différentes machines. Est-il normal de se fier aux valeurs initialisées par défaut pour les objets, ou faut-il définir explicitement toutes les variables d'instance dans le constructeur ?

En ce qui concerne les variables de la pile (au niveau de la procédure), mes tests montrent que les booléens unitialisés sont vrais, les entiers unitialisés sont 2129993264, et les objets non initialisés sont juste des pointeurs invalides (c'est-à-dire pas nil). Je suppose que la norme est de toujours définir les variables de niveau procédure avant d'y accéder ?

4 votes

Deux remarques : 1. Les enregistrements ne sont pas initialisés. 2. Les variables comptées par référence sont toujours initialisées. MAIS ! dans une fonction qui renvoie une chaîne de caractères, 'Resultat' n'est pas initialisé à une chaîne vide comme on pourrait s'y attendre, car 'Resultat' n'est pas une variable locale. C'est parce que 'Resultat' n'est pas une variable locale. Donc, il faut toujours faire : Resultat:= '' ;

0 votes

0 votes

Cela répond-il à votre question ? Quelles variables sont initialisées dans Delphi ?

119voto

Giacomo Degli Esposti Points 1341

Oui, c'est le comportement documenté :

  • Les champs d'objets sont toujours initialisés à 0, 0.0, '', False, nil ou ce qui s'applique.

  • Les variables globales sont toujours initialisées à 0 etc. également ;

  • Les variables locales à référence comptée* sont toujours initialisées à nil ou '' ;

  • Les variables locales non comptées par référence* ne sont pas initialisées, vous devez donc leur attribuer une valeur avant de pouvoir les utiliser.

Je me souviens que Barry Kelly J'ai écrit quelque part une définition pour "reference-counted", mais je ne la trouve plus, donc ceci devrait faire l'affaire en attendant :

compté en référence == qui sont eux-mêmes compté en référence, ou contiennent directement ou indirectement des champs (pour les enregistrements) ou des éléments (pour les tableaux) qui sont comptés comme des références : string, variant, interface ou réseau dynamique ou tableau statique contenant de tels types.

Notes :

  • record ne suffit pas à devenir une référence
  • Je n'ai pas encore essayé avec les génériques

2 votes

Comme Giacomo l'a souligné dans les commentaires ci-dessous, tout cela est expliqué dans les fichiers d'aide de Delphi à l'adresse ms-help://borland.bds4/bds4ref/html/Variables.htm. Dans Delphi 2009, j'ai trouvé les mêmes informations en recherchant "variables" dans l'aide (curieusement, j'ai essayé de nombreuses recherches mais je n'ai pas pensé à celle-là).

9 votes

Les variables locales sont initialisées (0 $) si elles sont d'un type géré comme les chaînes de caractères, les interfaces, les tableaux dynamiques ou les variantes.

2 votes

Si c'est "la" réponse, je pense que quelqu'un devrait ajouter ce à quoi les sets et les enums sont initialisés pour être complet.

29voto

Barry Kelly Points 30330

Les variables globales qui n'ont pas d'initialisateur explicite sont allouées dans la section BSS de l'exécutable. Elles n'occupent pas réellement d'espace dans l'EXE ; la section BSS est une section spéciale que le système d'exploitation alloue et remet à zéro. Sur d'autres systèmes d'exploitation, il existe des mécanismes similaires.

Vous pouvez compter sur le fait que les variables globales sont initialisées à zéro.

27voto

mliesen Points 1047

Les champs de classe sont par défaut à zéro. Ceci est documenté afin que vous puissiez vous y fier. Les variables locales de la pile sont indéfinies, à moins qu'il ne s'agisse de chaînes ou d'interfaces, qui sont mises à zéro.

0 votes

Merci. "Zéro" m'embrouille un peu - cela signifie-t-il que les chaînes de caractères sont '', et que les interfaces sont nulles ?

4 votes

Oui, exactement cela. nil = 0 (au niveau de l'assembleur) et '' = nil (convention Delphi).

4 votes

"à moins d'une chaîne ou d'une interface" n'est pas une description complète de la réalité. Les tableaux dynamiques, par exemple, sont également initialisés. Plus généralement, la règle est que les variables de types gérés (comptant des références) sont initialisées, même si elles sont locales.

19voto

Heinrich Ulbricht Points 6425

Juste un petit mot (puisque vous êtes nouveau dans Delphi) : Les variables globales peuvent être initialisées directement lors de leur déclaration :

var myGlobal:integer=99;

3 votes

Depuis 10.3, il en va de même pour les variables locales

2 votes

Et si ce n'est pas fait explicitement, ils sont initialisés à 0, 0.0, False, nil, [], etc.

1 votes

@EdijsKolesnikovics : En utilisant quelle syntaxe (initialisation des variables locales) ? VAR X : NOMBRE ENTIER = 0 ; ne fonctionne pas... ("Error E2195 Cannot initialize local variables")

9voto

Drew Gibson Points 930

Voici un extrait de Delphi in a Nutshell de Ray Lischner. Chapitre 2

" Lorsque Delphi crée un objet pour la première fois, tous les champs commencent par être vides, c'est-à-dire que les pointeurs sont initialisés à nil, les chaînes de caractères et les tableaux dynamiques sont vides, les nombres ont la valeur zéro, les champs booléens sont False et les variantes ont la valeur Unassigned. (Voir NewInstance et InitInstance au chapitre 5 pour plus de détails)."

Il est vrai que les variables locales doivent être initialisées... Je considère le commentaire ci-dessus selon lequel "les variables globales sont initialisées" comme douteux jusqu'à ce qu'une référence soit fournie - je ne le crois pas.

éditer... Barry Kelly dit que l'on peut compter sur le fait qu'ils soient initialisés à zéro, et comme il fait partie de l'équipe du compilateur Delphi, je crois que cela tient la route :) Merci Barry.

3 votes

Dans l'aide de delphi 2006, vous pouvez le trouver ici : ms-help://borland.bds4/bds4ref/html/Variables.htm "Si vous n'initialisez pas explicitement une variable globale, le compilateur l'initialise à 0. Les données d'instance d'objet (champs) sont également initialisées à 0. "

2 votes

Descendu à cause de "Je ne crois pas à ça". Il s'agit de programmation, pas de religion. Et Giacomo vient de démontrer la vérité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X