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 Pascal Discussion :

[LG]Variable non initialisée.


Sujet :

Langage Pascal

  1. #1
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut [LG]Variable non initialisée.
    Bonjour, j'ai eu un "problème" avec un programme récemment créé. Mon code ressemblait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var b : boolean;
    begin
    while (not b) do begin ... b:=true; (or false) ... end;
    end.
    Je n'avais donc affecté aucune valeur à b avant d'entrer dans la boucle, et c'est dans cette boucle que je lui en affectait une.
    Dans une première version du programme (environ 12Ko), tout se passait comme si b valait "FALSE" par défaut. Puis, après plusieurs ajouts au programme en question (ajouts qui ne concernait en rien cette boucle et qui ne changeaient pas la valeur de b ; à ce moment là le fichier était d'environ 30Ko), quand j'exécutais le programme, b valait apparement "TRUE" par défaut.

    Le problème, que je ne comprend pas, c'est le pourquoi de la chose ! Parce que l'affectation de "vrai" ou "faux" à b n'était, selon toute probabilité, non aléatoire (à chaque fois que j'exécutais la première version, b valait "false" par défaut, de même, à chaque fois que j'exécutais la seconde, b était affecté de "true").

    Alors est-ce que l'affectation des valeurs à une variable dépend de la taille du fichier, ou à quoi est dû ceci ? (je sais qu'il ne faut pas ne pas affecter une valeur à une variable, mais c'était un oublie, c'est corrigé maintenant.)

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    En fait, toute variable non initialisée doit être considérée comme ayant une valeur indéterminée. Donc, il faut éviter cette situation.

    Pour un booléen, c'est plus traître car la valeur false correspond à un octet nul et la valeur true à un octet non nul (enfin, ça dépend quand même un peu du compilateur). Il y a donc 255 fois plus de chances de démarrer avec un booléen true plutôt que false.

    Pour épargner une instruction d'affectation, tu peux définir non pas des variables globales mais bien des constantes typées. L'avantage de celles-ci est qu'elles ont une valeur au démarrage du programme. Elles sont également stockées dans le segment de données du programme, donc il n'y a pas de problème à ce niveau.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Bonjour

    En fait, quand le programme démarre, c'est rarement sur une zone de mémoire vierge : il y a eu des données avant, elles ne sont pas effacées.
    Donc, quand tu démarres ton programme avec une version courte ou avec une version longue (ajout de lignes de code), la variable n'est sans doute pas dans la même case mémoire. Il n'y a donc pas la même valeur au lancement de la chose.
    D'où les différences de comportement.

    Moralité, quand on commence un programme, une procédure..., il faut toujours initialiser les variables, afin d'être sûr de la valeur de départ.

    C'est une règle absolue, quel que soit le langage, quelles que soient les circonstances (et c'est encore plus vrai quand on utilise des pointeurs...)

    Cordialement
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par ALT
    En fait, quand le programme démarre, c'est rarement sur une zone de mémoire vierge : il y a eu des données avant, elles ne sont pas effacées.
    Donc, quand tu démarres ton programme avec une version courte ou avec une version longue (ajout de lignes de code), la variable n'est sans doute pas dans la même case mémoire. Il n'y a donc pas la même valeur au lancement de la chose.
    D'où les différences de comportement.
    Merci bien, je crois que ça doit être la cause de mon "problème". J'avoue que j'ai du mal à bien comprendre la gestion de la mémoire...

    Citation Envoyé par ALT
    il faut toujours initialiser les variables
    Je le fais systématiquement, mais celle-ci était passée à la trappe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Variable $_post vide ou non initialisé après la validation
    Par gnoupix dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2014, 13h03
  2. Réponses: 7
    Dernier message: 15/11/2007, 14h41
  3. Réponses: 5
    Dernier message: 12/05/2005, 10h49
  4. Réponses: 6
    Dernier message: 16/03/2005, 14h44
  5. Réponses: 6
    Dernier message: 13/05/2004, 15h40

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