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

Free Pascal Discussion :

Constantes typées ou non typées ?


Sujet :

Free Pascal

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Constantes typées ou non typées ?
    Bonjour la commu !

    Je reviens vers pour un nouveau souci

    En effet, il m'a pris l'envie (comme ça...) de faire de la constante, puis comme je suis un farceur, de les utiliser dans des cases qui n'acceptent que des expressions constantes, ce qui est logique ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Case ConteneurDonnees.TypeNoeud of						   
    		TYPE_COMMENTAIRE : writeln('Type');
    		else Writeln('Type inconnu :'+IntToStr(ConteneurDonnees.TypeNoeud)); 
    	    End;
    En revanche, lors de la compilation FPC m'indique un truc un peu spécial...


    madlib_xml.pas(218,25) Error: Constant Expression expected
    Alors, je cherche un peu et m'aperçois que les constantes ne sont pas des constantes, mais des variables vérifiées à la compilation en écriture et qui en fait, sort une erreur si on essaie de les modifier.

    Dommage !

    Du coup ma question : Y a-t-il un moyen de faire une vraie constante, qui remplace à la compilation par la valeur que l'on a placée dedans ?

    Nota : Quand je parle d'un moyen, c'est différent de celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {$DEFINE TYPE_COMMENTAIRE := 8}

    Merci pour votre aide précieuse !

    MAD

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut,

    2 choses :
    Citation Envoyé par madndf Voir le message
    En revanche, lors de la compilation FPC m'indique un truc un peu spécial...
    madlib_xml.pas(218,25) Error: Constant Expression expected
    On ne sait pas à quelle ligne de ton exemple fait référence le ligne 218 remontée...

    Citation Envoyé par madndf Voir le message
    Du coup ma question : Y a-t-il un moyen de faire une vraie constante, qui remplace à la compilation par la valeur que l'on a placée dedans ?
    Phrase pas claire ; on a le choix entre
    qui remplace à la compilation quelquechose par la valeur que l'on a placée dedans
    ou
    qui remplace à la compilation par la valeur que l'on a placée dedans

    Il manque un mot ou il y en a un de trop.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Bonjour Jipété,

    Désolé, je pensais être plus clair, je vais donc reformuler.

    La ligne 218 cela correspond à la constante TYPE_COMMENTAIRE que j'ai définie avec "Const".
    C'était surtout le message d'erreur plus que la ligne qui était à mes yeux important :
    Error: Constant Expression expected
    Pour la question, c'est en effet un mot de trop : par

    Pour faire simple :

    Qu'elle est l'instruction de définition qui permet de faire de vraies constantes et qui permettent d'être utilisé là où elles sont attendues, par exemple dans un "Case".

    Ou encore pour être plus concis :

    Qu'elles sont les constantes que l'on peut utiliser lors de l'utilisation de "Case" ?

  4. #4
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Tu a probablement oublié de faire précéder ta déclaration ;

    Citation Envoyé par madndf Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {$DEFINE TYPE_COMMENTAIRE := 8}
    D'un :
    Il ne faut pas confondre le concept de constante compile-time du pré-processeur FPC et le concept de constantes (typé ou non) du langage Pascal .

    Le premier, mis en oeuvre lors d'une première passe, effectue une substitution de toute occurence du symbole par sa valeur, encore faut-il que cette substitution soit autorisée (c'est le rôle de $MACRO ON). Le symbole en lui-même n'a aucune signification au niveau Pascal (ce n'est, de son point de vue qu'un commentaire).

    [EDIT] Désolé, ton précédent post est arrivé pendant que je rédigeait celui-ci et je ne l'avais pas vu
    Alors question subsidiaire : quand tu dis
    Citation Envoyé par madndf
    La ligne 218 cela correspond à la constante TYPE_COMMENTAIRE que j'ai définie avec "Const".
    Sagit-il d'une constante typée ou non typée ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Bonjour DomDA91,

    Merci pour ta réponse.

    La déclaration de constante par macro compilation {$DEFINE TYPE_COMMENTAIRE := 8} fonctionne, puisque c'est celle que j'utilise pour le dépannage.

    Mais, je voulais passer par la déclaration "Const" pour avoir ces constantes renseignées dans la classe de l'objet.

    Sagit-il d'une constante typée ou non typée ?
    C'est en effet du typé, d'ailleurs je crois que j'ai essayé les deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		Const					
    			TYPE_COMMENTAIRE : integer = 8;
    			TYPE_NOEUD_BALISE : integer = 1;
    			TYPE_TEXTE : integer = 3;
    			TYPE_CDATA : integer = 4;
    			SEP_CheminXPath = '/';

  6. #6
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Citation Envoyé par madndf Voir le message
    Mais, je voulais passer par la déclaration "Const" pour avoir ces constantes renseignées dans la classe de l'objet.

    C'est en effet du typé, d'ailleurs je crois que j'ai essayé les deux.
    Je t'engage à refaire l'essai, pour moi une constante non typée peut être utilisée comme cas d'une instruction case alors qu'une constante typée ne le peut pas.

    En effet, pour des raisons de compatibilité Turbo Pascal, les constantes typées ne sont pas des vraies constantes mais plutôt des variables initialisées. Free Pascal permet seulement de les mettre en "lecture seule" avec la directive {$J Off} ($J est On par défaut), mais leur comportement reste malgré tout celui d'une variable.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Citation Envoyé par DomDA91 Voir le message
    Je t'engage à refaire l'essai, pour moi une constante non typée peut être utilisée comme cas d'une instruction case alors qu'une constante typée ne le peut pas.

    En effet, pour des raisons de compatibilité Turbo Pascal, les constantes typées ne sont pas des vraies constantes mais plutôt des variables initialisées. Free Pascal permet seulement de les mettre en "lecture seule" avec la directive {$J Off} ($J est On par défaut), mais leur comportement reste malgré tout celui d'une variable.
    Salut,

    Même avec des constantes non typées, cela ne passe pas, il faut écrire des valeurs littérales, c'est ballot mais il faut faire avec (cf la doc de FP).
    Les constantes typées ont le même rôle que les variables statiques rencontrées en langage C, elles permettent dans une routine de créer une variable locale conservant sa valeur d'un appel à l'autre, comme le montre cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #!/usr/bin/instantfpc
    {$mode objfpc}{$H+}
     
    uses
      SysUtils;
     
    procedure TestConst;
    // Façon de déclarer une variable statique
    const I : Integer = 0;
    begin
      Inc(I);
      WriteLn(I);
    end;
     
    procedure TestVar;
    // Façon de déclarer une variable locale au comportement habituel
    var I : Integer = 0;
    begin
      Inc(I);
      WriteLn(I);
    end;
     
    var
     i : integer;
    begin
      WriteLn('TestConst :');
      for i := 1 to 10 do TestConst;
     
      WriteLn('TestVar :');
      for i := 1 to 10 do TestVar;
    end.
    Citation Envoyé par Sortie
    TestConst :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TestVar :
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    On voit que la constante typée a conservé sa valeur d'un appel à l'autre.
    Une constante typée au niveau global revient à définir une simple variable globale.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Membre émérite

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut,
    Même avec des constantes non typées, cela ne passe pas, il faut écrire des valeurs littérales, c'est ballot mais il faut faire avec (cf la doc de FP).
    Les constantes typées ont le même rôle que les variables statiques rencontrées en langage C, elles permettent dans une routine de créer une variable locale conservant sa valeur d'un appel à l'autre, comme le montre cet exemple :
    ....
    Je suis d'accord avec cela mais ce n'était pas le problème posé par madndf.

    Ce que je pense avoir compris de sa question est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure Test(Value: integer);
     Const Deux = 2;            // constante non typée
           Trois : Integer = 3;  // constante typée
     Begin
         Case Value Of
         Deux : {fait quelque chose pour 2}; // ça ça passe
         Trois :{fait autre chose pour 3};    // et ça ça ne passe pas : Error:Constant Expression expected
         end;
     end;
    Exemple testé avec Lazarus 1.8RC4 et FPC 3.0.4RC1

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Yep !
    Citation Envoyé par e-ric Voir le message
    Une constante typée au niveau global revient à définir une simple variable globale.
    Ça doit être un poil plus vicieux, parce que je viens de tomber sur ce gag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
      WIDTH : integer = 512;
     
    Type
      Ecran = ARRAY [1..WIDTH] of integer;
    et à la compilation :
    Citation Envoyé par compilo
    Error: Can't evaluate constant expression


    Bon, je remplace ce WIDTH par sa valeur, 512, le reste compile mais je n'ai pas les mêmes résultats qu'avec 512 partout.


    Avec 512 partout, c'est le code d'origine :
    Nom : avec_512.png
Affichages : 1025
Taille : 7,4 Ko
    et un résultat correct.

    Avec WIDTH partout (sauf l'array vue ci-dessus) grâce à Chercher/Remplacer :
    Nom : avec_width.png
Affichages : 950
Taille : 7,4 Ko
    et un AV à la fermeture du prog...

    Nous entrons dans l'ère de l'informatique aléatoire ! Ça plus les ordinateurs quantiques, on n'a pas fini de rigoler...

    EDIT :

    ps : j'arrive à placer correctement la sinusoïde en remplaçant WIDTH div 2 par une autre constante WIDTH_DIV_2, mais ça n'empêche pas que le trait du bas du cadre n'est pas dessiné, pas plus que celui de droite, et retour du SIGSEGV à la clôture du prog.

    Bon, je n'ai ni le temps ni l'envie d'essayer de comprendre pourquoi remplacer "256" par la constante WIDTH_DIV_2 à qui j'ai affecté la valeur 256 fait planter le machin, une chose est sure, c'est très désagréable.

    Maintenant, c'est vrai que j'aimerais bien comprendre pourquoi l'infobulle me dit que WIDTH n'est pas utilisé alors qu'on voit bien un peu plus bas que ce n'est pas le cas...
    Nom : width_nu.png
Affichages : 2630
Taille : 27,5 Ko

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut,
    Citation Envoyé par Jipété Voir le message
    Maintenant, c'est vrai que j'aimerais bien comprendre pourquoi l'infobulle me dit que WIDTH n'est pas utilisé alors qu'on voit bien un peu plus bas que ce n'est pas le cas...
    Nom : width_nu.png
Affichages : 2630
Taille : 27,5 Ko
    je ne devais pas être bien réveillé quand j'ai fait ces tests, et je suis tombé dans le piège de mon OS sensible à la casse quand le client de l'OS, Lazarus en l'occurrence, n'y est pas sensible et réussit à outrepasser l'OS...

    Résultat, quand j'ai écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      WIDTH : integer = 512;
    c'était correct, mais à l'utilisation, on peut lire sur la copie d'écran,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with pb.Canvas do
    begin
      rectangle(1,1,WIDTH,WIDTH)
    et donc la WIDTH utilisée là est celle du pb.Canvas, hé oui...

    En renommant WIDTH en LARGEUR, plus de problème.

    Désolé pour le dérangement,

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/02/2011, 23h00
  2. [Virtual Pascal] Paramètre sous forme de constante non typée
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 18/06/2006, 08h13
  3. [VB.Net] cast du type 'DataRowview' en type 'Date' non valide
    Par badnane2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/06/2006, 15h50
  4. [TP] Constantes typées et non typées, variables
    Par poppels dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 26/10/2005, 23h00
  5. [access][sql] commen inserer un champ du type oui/non
    Par cmoa59 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/04/2005, 11h05

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