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 :

[Const et Case] Delphi Laxiste ?


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut [Const et Case] Delphi Laxiste ?
    Bonjour, je viens de remarquer un petit détail irritant (pas grave j'aurais oublié demain mais bon...)

    Delphi demande normalement de la rigueur pour la déclaration des variables.

    J'ai donc écris ma constante comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      CONST_ZERO : Integer = 0;
    Puis utilisé comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Case MaVariable of
      CONST_ZERO : showmessage('zéro');
    end;
    Si vous recopiez ce code, vous pourrez voir un joli plantage "expression constante attendue"

    alors que si on écrit (en étant moins précis donc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      CONST_ZERO  = 0;
    Puis utilisé comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Case MaVariable of
      CONST_ZERO : showmessage('zéro');
    end;
    là ça passe bien !

    Y a t il une option de compilation à décocher ou Delphi s'est-il mis en vacances niveau rigueur d'écriture ?

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    En regardant l'aide de D2005

    Une vraie constante est un identificateur déclaré dont la valeur ne peut changer. Par exemple,
    const MaxValue = 237;
    déclare une constante appelée MaxValue qui renvoie l'entier 237. La syntaxe de déclaration d'une vraie constante est :

    const identifier = constantExpression
    où identifier est un identificateur valide et constantExpression est une expression qui peut être évaluée par le compilateur sans exécuter le programme.

    Si constantExpression renvoie une valeur scalaire, vous pouvez spécifier le type de la constante déclarée en utilisant un transtypage de valeur. Par exemple :
    const MyNumber = Int64(17);
    déclare une constante appelée MyNumber, de type Int64, qui renvoie l'entier 17. Sinon, le type de la constante déclarée est du type de constantExpression.

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    bonjour Malatar,
    ça n'explique pas pourquoi mon case provoque une erreur dans un cas de déclaration de ma constante et pas dans l'autre ?
    Ou alors je n'ai pas bien compris ton explication

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      CONST_ZERO : Integer = 0;
    Ne déclare pas une constante mais bien une variable initialisée à 0 !

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    C'est quand même bizarre, y-a-t'il une justification convaincante à cette sémantique qui me semble trompeuse et pas très régulière ?

    Serait-elle connexe aux constantes modifiables (post remontant à quelques temps auquel j'avais répondu)

    cdlt

    e-ric

  6. #6
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Non ce n'est pas une variable initialisée, mais une constante typée !
    Sinon ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      CONST_ZERO: Integer = 0;
    La différence ? La possibilité de déclarer des constantes tableau, enregistrement, procédure, pointeur...

    Je n'ai pas trouvé dans l'aide d'indication par rapport aux constantes modifiables

  7. #7
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    c'est quand même balot que le Case n'accepte pas de constante Typée d'un bon type (integer dans l'exemple).

    Et surtout le message d'erreur n'est pas clair "expression constante attendue" il faudrait avoir "expression constante non typée attendue"

    Cette erreur se reproduit-elle sur Delphi 2005 ?

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par -Sylvain Leray-
    c'est quand même balot que le Case n'accepte pas de constante Typée d'un bon type (integer dans l'exemple).

    Et surtout le message d'erreur n'est pas clair "expression constante attendue" il faudrait avoir "expression constante non typée attendue"

    Cette erreur se reproduit-elle sur Delphi 2005 ?
    L'erreur est tres clair je trouve, ce que tu déclares est une variable pas une constante typée (voir ce que j'ai mis en rouge pour typer une constante).

    Citation Envoyé par Aide D2005
    La syntaxe de déclaration d'une vraie constante est :

    const identifier = constantExpression

  9. #9
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Citation Envoyé par Malatar
    const MyNumber = Int64(17);
    déclare une constante appelée MyNumber, de type Int64, qui renvoie l'entier 17
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     const MyNumber = Int64(17);
    est bien équivalent (au type de variable près) à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const MyNumber : Integer = 17;
    Si on en croit Bestiol, on ne déclare pas une variable, mais bien une constante typée.

    Désolé si c'est une polémique stérile, mais cette sémantique me trouble ! Quel intérêt de mettre Const au lieu de Var pour déclarer une variable dans ce cas ?

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par -Sylvain Leray-
    Désolé si c'est une polémique stérile, mais cette sémantique me trouble ! Quel intérêt de mettre Const au lieu de Var pour déclarer une variable dans ce cas ?
    Reponse dasn l'aide :

    Citation Envoyé par Aide Delphi 2005
    Une vraie constante est un identificateur déclaré dont la valeur ne peut changer
    Déclare une variable et gère la comme une constante, le jour où sans le vouloir tu modifies cette variable, tu vas chercher des heures pourquoi ton prog bug a tel ou tel endroit.
    Alors qu'avec une constante cette valeur ne peut en aucun cas être modifier.
    D'où la différence.

  11. #11
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    De mémoire les "contantes typés affectables" sont equivalent aux declaration static du langage C

  12. #12
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Citation Envoyé par Eric.H
    De mémoire les "contantes typés affectables" sont equivalent aux declaration static du langage C
    Oui mais là, une constante typée n'est pas affectable... Essaye, ça ne compilera pas !

    Je ne retrouve même pas comment faire une constante affectable

  13. #13
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par Bestiol
    Oui mais là, une constante typée n'est pas affectable... Essaye, ça ne compilera pas !
    Ben si no problemo 8)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm4.Button1Click(Sender: TObject);
    CONST _Test_:Byte=0;
    begin
      Inc(_Test_);
      _Test_:=_Test_+1;
      ShowMessage(IntToStr(_Test_));
     
    end;
    Mais bien entendu pour cela il faut cocher "Constantes Typées affectables" dans les options du compilateur.

  14. #14
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Et quel intérêt d'utiliser une déclaration constante typée pour modifier sa valeur à l'éxecution ? Dans ce cas c'est la même utilisation qu'une variable, donc il serait plus rigoureux de la déclarer var plutôt que const ?

    A moins que j'ai omis une subtilité.

  15. #15
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Dans le petit exemple plus haut

    Premier click : affiche 2
    Deuxieme clicke : affiche 4.....

    la constante type n'est affecté qu'au démarrage du programme. Alors que la const est dans une procedure.... elle garde toujours sa valeur lorsque l'on revient dans la boucle. Dans certains cas cela peut être pratique.

    Donc le bon terme est celui du language C, a savoir une variable static
    Si Borland avait rajouter le mot clé, cela aurait été plus clair

  16. #16
    Membre expert
    Avatar de Bestiol
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 515
    Points : 3 894
    Points
    3 894
    Par défaut
    Citation Envoyé par Eric.H
    Mais bien entendu pour cela il faut cocher "Constantes Typées affectables" dans les options du compilateur.
    C'est donc ça
    Merci

    Donc le bon terme est celui du language C, a savoir une variable static
    Si Borland avait rajouter le mot clé, cela aurait été plus clair
    +1 ^^

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

Discussions similaires

  1. switch case en delphi
    Par reuqnas dans le forum Débuter
    Réponses: 13
    Dernier message: 01/05/2014, 22h40
  2. delphi (if else case of )
    Par fz.saida dans le forum Langage
    Réponses: 9
    Dernier message: 03/05/2013, 09h53
  3. [Delphi] [Algorythmie] [case of] case of dynamique ?
    Par Stormbull dans le forum Langage
    Réponses: 7
    Dernier message: 22/12/2005, 00h30
  4. [Rave et delphi] Case à cocher
    Par Leesox dans le forum Rave
    Réponses: 11
    Dernier message: 30/09/2005, 20h46
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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