IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[XE3] Valeur par défaut des champs d'un record sans constructeur


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2022
    Messages : 18
    Points : 20
    Points
    20
    Par défaut [XE3] Valeur par défaut des champs d'un record sans constructeur
    Bonjour,

    Sous XE3 et plus, est que les champs d'un record ont des valeurs par défaut sans passer par un constructeur ? ou faut il les initialiser ?
    exemple : champ1: boolean à false, champs2: integer à 0, champ3: string à ''

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Comme tous les types, ça dépend où il est utilisé. Oui si variable globale ou le champ d'un objet. Non pour une variable locale.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2022
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Il s'agit bien d'un champ de record. Donc ni une variable locale ni un champ d'une classe

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Ce n'est pas ce qu'il fallait comprendre

    si le record est un membre de classe, il sera mis à zéro parce que l'instance hote le videra
    si le record est une variable locale, il prendra les valeurs en cours en mémoire à cette endroit dans la pile, sauf les string et array qui sont des types managés, ils seront vides.
    si le record est une variable globale, j'aurais dit qu'il prend la valeur en cours en mémoire dans le tas mais Andnotor semble dire qu'il y a une valeur par défaut, je n'utilise quasiment jamais de variable globale, que j'initialise à nil (oui donc des objets pas de record)

    Si tu veux être tranquille, soit tu fais un ZeroMemory systématique soit tu fais un constructeur qu'il faudra appeler explicitement.
    Ou alors, tu maitrises parfaitement ton code et tu initialises le record comme il doit l'être.

    Il faut savoir qu'initialiser à zéro une zone mémoire sous FastMM (je crois que XE3 est déjà en FastMM) est beaucoup plus lent que le temps d'allocation.
    Un SetLength d'un tableau de 1Mo par exemple, prend 99% de son temps à écrire les zéro qu'à obtenir le pointeur, ... avant FastMM, l'allocation était très lente (encore plus la réallocation)

    Donc forcer ton record à zéro, faut le faire à bon escient, cela dépend de sa taille, tu n'as pas trop d'inquiètude avec un record sous 1Ko (genre si tu as 200-1000 champs)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2022
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Effectivement je n'avais pas compris la 1ère réponse. Merci pour les précisions c'est plus clair

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    1 976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1 976
    Points : 6 221
    Points
    6 221
    Par défaut
    Il y a une règle en programmation: Toujours initialiser un objet créé!!!

    On ne crée pas un objet quel qu’il soit sans lui fixer une valeur de départ: On déclare une variable globale? Un simple monString: string=(''); ou un monInteger:integer=(0); ne coûte rien et évite que la variable prenne au départ une valeur venu de nul part!!!

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Citation Envoyé par Anselme45 Voir le message
    Il y a une règle en programmation: Toujours initialiser un objet créé!!!
    Rien ne s'y oppose mais c'est souvent inutile. Les champs d'un objet sont initialisés à zéro (nil, blabla) par la méthode TObject.InitInstance. Quant aux variables globales non initialisées, elles sont stockées dans la section BSS de l'exe et reportées dans une section initialisée du processus, c'est directement géré par l'OS.

    En résumé :
    • champ d'un objet = initialisé
    • variable globale = initialisée
    • variable locale = non initialisée


    Et enfin une remarque sur les types managés : ils sont initialisés pour autant qu'on passe par une déclaration de variable mais ne le sont plus si on alloue soi-même l'instance par GetMem. Dans ce cas AllocMem est obligatoire, sinon VA quasi assurée.

Discussions similaires

  1. Valeur par defaut des champs d'une table
    Par Cyrille36 dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/11/2011, 20h47
  2. set_entry et valeurs par défaut des champs
    Par Elianora la blanche dans le forum SugarCRM
    Réponses: 1
    Dernier message: 17/10/2011, 15h30
  3. [WSS3] valeur par défaut pour champ "Assigné à"
    Par vds2302 dans le forum SharePoint
    Réponses: 6
    Dernier message: 23/07/2007, 10h33
  4. Affecter valeur par defaut si champ vide
    Par uloaccess dans le forum Access
    Réponses: 5
    Dernier message: 09/01/2006, 17h12
  5. Valeur par défaut de champs d'un sous-formulaire
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 07h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo