1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 18
    Points : 11
    Points
    11

    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 éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 087
    Points : 8 345
    Points
    8 345

    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.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 18
    Points : 11
    Points
    11

    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 confirmé

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

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

    Informations forums :
    Inscription : octobre 2009
    Messages : 115
    Points : 534
    Points
    534

    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 à l'essai
    Profil pro
    Inscrit en
    octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 18
    Points : 11
    Points
    11

    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 confirmé

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

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

    Informations forums :
    Inscription : octobre 2009
    Messages : 115
    Points : 534
    Points
    534

    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
    Traqueur de tritons et autres bestioles
    Inscrit en
    mars 2002
    Messages
    1 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Traqueur de tritons et autres bestioles

    Informations forums :
    Inscription : mars 2002
    Messages : 1 489
    Points : 3 618
    Points
    3 618

    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 8.x 64bit, Lazarus 1.6 (FPC 3.0), Python 3

    "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 confirmé

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

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

    Informations forums :
    Inscription : octobre 2009
    Messages : 115
    Points : 534
    Points
    534

    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 éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 087
    Points : 8 345
    Points
    8 345

    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 : 42
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 : 42
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 : 37
Taille : 27,5 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    6 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 087
    Points : 8 345
    Points
    8 345

    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 : 37
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,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2011, 00h00
  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, 09h13
  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, 16h50
  4. [TP] Constantes typées et non typées, variables
    Par poppels dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 27/10/2005, 00h00
  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, 12h05

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