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

Lazarus Pascal Discussion :

Problème avec Helper : erreur "Illegal qualifier"


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué
    Problème avec Helper : erreur "Illegal qualifier"
    Bonjour,

    Je suis en train de me remettre au pascal avec Lazarus et le livre Object Pascal Handbook, j'en suis au code qui utilise les helpers et j'essaie donc le code suivant :


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Program Project1;
     
    {$modeswitch typehelpers}
    var
      N:Integer;
     
    Begin
      N:=10;
      WriteLn(N.ToString);
      readln;
    End.


    Et j'obtiens le message d'erreur suivant à la compilation:
    Compilation du projet - Cible : C:\Users\JENRAM~1\AppData\Local\Temp\project1.exe : Code de sortie 1 - Erreurs : 1
    project1.lpr(9,13) Error: Illegal qualifier
    J'ai été lire le post suivant :

    unite-va-simplifier-vie-typeshelpers

    Que voyez-vous d'incorrect? Je me doutais au départ qu'il y aurait un problème vu que lorsque je tapais le point l'éditeur ne me proposait aucune complétion.

    Merci d'avance.

  2. #2
    Membre habitué
    Rebonjour,

    J'ai vu mon erreur : j'ai oublié d'utilisé sysUtils!


  3. #3
    Membre éclairé
    Citation Envoyé par jenramac Voir le message
    ...
    Je ne vois absolument pas l'avantage d'utiliser les "helpers" dans ce cas car, dans l'unité "SysUtils" la fonction "ToString" fait appel à la fonction "IntToStr".

    L'exécution sera plus rapide en écrivant directement :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Writeln(IntToStr(N));


    Ce qui qui évite un appel supplémentaire de fonction.

    Cordialement.

    Pierre

  4. #4
    Membre habitué
    Citation Envoyé par ChPr Voir le message
    Je ne vois absolument pas l'avantage d'utiliser les "helpers" dans ce cas car, dans l'unité "SysUtils" la fonction "ToString" fait appel à la fonction "IntToStr".

    L'exécution sera plus rapide en écrivant directement :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Writeln(IntToStr(N));


    Ce qui qui évite un appel supplémentaire de fonction.

    Cordialement.

    Pierre
    Bonjour,

    Ce n'est pas pour utilisation mais simplement pour ajouter à ma besace et effectivement cela est moins efficace pour ce cas.

    Bonne journée.

  5. #5
    Membre éclairé
    Citation Envoyé par jenramac Voir le message
    Bonjour,

    Ce n'est pas pour utilisation mais simplement pour ajouter à ma besace et effectivement cela est moins efficace pour ce cas.

    Bonne journée.
    C'est une bonne pratique. Pour autant, il serait intéressant d'analyser l'utilité d'un "helper" à chaque fois qu'on veut l'utiliser. Je suis surpris de voir intégré à une unité de Lazarus des "helpers" dont le seul but est de renommer une fonction, mais pour cela devoir passer par une fonction supplémentaire !!!

    Cordialement.

    Pierre

  6. #6
    Modérateur

    Concernant cet intérêt, un argument qui m'avait été exposé dans la discussion citée résidait dans l'aide apportée par la complétion de code et l'inutilité de retenir un nom de fonction pas toujours évident (compliqué à retenir, ou dont on ne souvient jamais du sens, style ReplaceString, ReplaceStr, StrReplace ou StringReplace, etc.).
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Rédacteur/Modérateur

    Citation Envoyé par ChPr Voir le message
    Ce qui qui évite un appel supplémentaire de fonction.
    A contrôler sous Lazarus mais sous Delphi ces méthodes sont INLINE, il n'y a pas d'appel supplémentaire.

  8. #8
    Membre habitué
    Citation Envoyé par Andnotor Voir le message
    A contrôler sous Lazarus mais sous Delphi ces méthodes sont INLINE, il n'y a pas d'appel supplémentaire.
    Bonjour,

    Oui, elle est mise inline :

    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
    TIntegerHelper = Type Helper for Integer { for LongInt Type too }
      public
        const
          MaxValue = 2147483647;
          MinValue = -2147483648;
      Public
        Class Function Size: Integer; inline; static;
        Class Function ToString(const AValue: Integer): string; overload; inline; static;
        Class Function Parse(const AString: string): Integer; inline; static;
        Class Function TryParse(const AString: string; out AValue: Integer): Boolean; inline; static;
      Public
        Function ToBoolean: Boolean; inline;
        Function ToDouble: Double; inline;
        Function ToExtended: Extended; inline;
        Function ToHexString(const AMinDigits: Integer): string; overload; inline;
        Function ToHexString: string; overload; inline;
        Function ToSingle: Single; inline;
        Function ToString: string; overload; inline;
      end;


    Comme les autres d'ailleurs.

  9. #9
    Membre éclairé
    Citation Envoyé par Andnotor Voir le message
    A contrôler sous Lazarus mais sous Delphi ces méthodes sont INLINE, il n'y a pas d'appel supplémentaire.
    C'est effectivement le cas avec Lazarus. Donc, pas d'influence sur le temps d'exécution.

    Voir quand même cet article.

    Cordialement.

    Pierre

  10. #10
    Membre expert
    Citation Envoyé par ChPr Voir le message
    C'est une bonne pratique. Pour autant, il serait intéressant d'analyser l'utilité d'un "helper" à chaque fois qu'on veut l'utiliser. Je suis surpris de voir intégré à une unité de Lazarus des "helpers" dont le seul but est de renommer une fonction, mais pour cela devoir passer par une fonction supplémentaire !!!

    Cordialement.

    Pierre
    Salut pour ma par maintenant j'ai du mal à me séparer de mon unité donnée en lien (que j'ai fait évoluer depuis). Je gagne un temps fou lors du codage (au lieu de me taper des inttostr et autre strto...) tu tapes le point et To et hop plus qu'a appuyer sur entrée.
    En plus l'avantage c'est la complétion du code, si tu ne te souvient plus du nom d'une fonction et dans quelle unité. Et comme le dis AndNotOr avec la déclaration INLINE c'est du tout cuit. Et même si si c'est un sous appel, la perte de performance sur ce genre de manipulation est minime voir nulle, le compilo fait plutôt bien son travail.

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP