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

Lazarus Pascal Discussion :

Addition et Affichage d'un QWord en assembleur Intel [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut Addition et Affichage d'un QWord en assembleur Intel
    Bonjour,

    Je fais une petit essai en assembleur Lazarus qui consiste à faire une addition de deux QWord. Je suis pas trop doué, je m'y mets juste:

    Voici le code de mon test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.BtnASMClick(Sender: TObject);
     Var  q1, q2 : QWord;
    begin
        Q1 := 18446744073709551000; // Q1 + Q2 = 18446744073709551615 = Max de QWord 64 bits
        Q2 := 615;
      {$ASMMODE INTEL}
      Asm
        Mov RAX,Q1
        ADD Q2, RAX
      End;
      Form1.Memo1.Lines.Add('CALCULS EN ASSEMBLEUR');
      Form1.Memo1.Lines.Add('Q1 + Q2 = '+format('%0.0n', [double(Q2)]);
    Le problème, c'est que Format me bouffe les 3 dernières décimales. Avec Jipété qui est sur Linux, il obtient toutes les décimales. Voir ici!
    Il faudrait donc créer une fonction de type QWordToStr qui donne un string...

    Je cherche donc une gestion par assembleur car j'ai essayé d'autres algorithmes mais, je suis toujours limité par le Type QWord qui n'est pas vraiment utilisable pour des conversions...
    Donc, il faudrait que je puisse afficher maintenant en assembleur le résultat sous forme d'un string.

    Est-ce que vous pouvez m'aider?
    Je vais continuer à chercher maos je n'ai pas trouver d'instruction permettant de transformer un QWord en string. Ul faut sans doute écrire une routine pour ça!
    A+

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bonjour,
    Citation Envoyé par Jlmat Voir le message
    Je vais continuer à chercher mais je n'ai pas trouvé d'instruction permettant de transformer un QWord en string.
    Et le Format que j'ai utilisé dans le lien que tu as donné, c'est quoi, alors ?

    Le problème (contournable !), c'est qu'il y a une erreur quelque part soit dans la compilation soit dans un fichier de définition ou que sais-je encore, toujours est-il que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      qw: QWord;
    begin
      qw := 18446744073709551615;
    je me prends une erreur
    Citation Envoyé par compilo
    Warning: range check error while evaluating constants (18446744073709551615 must be between -9223372036854775808 and 9223372036854775807)
    , erreur en contradiction avec la doc qui voit QWord comme un nombre non signé.

    Donc, pour contourner, tu oublies QWord et tu utilises Uint et ça ira très bien avec la bidouille double(uqw), sinon ça affiche -1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      uqw: uint64;
    begin
      uqw := 18446744073709551615;
      DefaultFormatSettings.ThousandSeparator := ' '; // pour l'esthétique
      // avec 24 (pour voir), ne va quand même pas au-delà des 20 chiffres
      Caption := format('chiffres : %24.0n', [double(uqw)]);
    Pas au point, les grands nombres...

    Le gag c'est ça, extrait de l'aide :
    Nom : gag-qword.png
Affichages : 430
Taille : 15,0 Ko

  3. #3
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Le problème (contournable !), c'est qu'il y a une erreur quelque part soit dans la compilation soit dans un fichier de définition ou que sais-je encore, toujours est-il que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      qw: QWord;
    begin
      qw := 18446744073709551615;
    je me prends une erreur , erreur en contradiction avec la doc qui voit QWord comme un nombre non signé.
    Curieux, moi je n'ai pas d'erreur de compilation (ni à l'exécution) avec ce code, que ce soit sous Windows ou Ubuntu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    var
      qw: QWord;
    begin
      qw := 18446744073709551615;
    end;
    Qu'as tu comme clauses uses ?

    bb84000

  4. #4
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    hello Jipété

    Et le Format que j'ai utilisé dans le lien que tu as donné, c'est quoi, alors ?
    Oui, excuse moi, je ne sais plus où l'on avait conclu que sous Windows, je n'obtenais pas la même précision que toi...

    J'obtiens à l'affichage "chiffres : 18 446 744 073 709 552 000" car on en avait conclu dans notre échange cité précédemment que c'est parce que j'étais sous Windows et que toi, tu étais sous Linux!
    Le nombre est arrondi qw := 18446744073709551615; devient 18446744073709552000

    C'est pour ça, j'ai fait un tas d'essai en lazarius jusqu'à réécrire la fonction de puissance de 2 en essayant de passer par une chaine binaire et recalculer le QWord en plaçant les digits un à un. Rien n'y fait, donc je me tourne vers l'assembleur:

    je défini par exemple une fonction temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       function QWordToStr (Q : QWord) : String;
         begin
           result := '18446744073709551615';
           {$ASMMODE INTEL}
           Asm
             Mov RAX,result
           end;
         end;
    Ensuite, je dois faire appel à la fonction par un Call en assembleur mais j'ai pas su faire encore, je n'ai pas trouvé d'exemple en 64 bits pour afficher une chaine de type string

  5. #5
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Salut bb84000

    Tu travailles en quelle version de Lazarus.
    Quelles unités déclares-tu dans le Uses?
    Vraiment curieux, cette affaire!

  6. #6
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Lazarus 2.2.4 sous Windows et Ubuntu

    Le code complet dans les deux OS :

    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
    33
    34
    35
    36
    37
    38
    39
    40
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
     
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      qw: QWord;
    begin
      qw := 18446744073709551615;
    end;
     
    end.
    Pas d'erreur de compil ni d'exécution. Maintenant je vais voir pour la conversion en chaîne.

    bb84000

    Modif: Jipété a réagi entre temps !

  7. #7
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Salut !

    BASS a tort de redéfinir comme ça un type dans son unité. C'est carrément une erreur. Dans bass.h pour C++, il est défini comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef uint64_t QWORD;
    Mais comme Lazarus le définit déjà comme uint64, on peut commenter la ligne correspondante dans Bass.pas.

    Comme j'ai réécrit l'unité pour le chargement dynamique de la bibliothèque, je vais virer cette redéfinition dans lazd_bass.pas.

    bb84000

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Une lecture ici, avec le post de Josh qui propose une solution que je viens de tester et qui fonctionne.

    Mais ça dépend du contexte ! ! !
    Pour faire des petits tests rapides, bien souvent j'utilise le projet ouvert sur le bureau, dans lequel je rajoute un bouton et le code à tester et incroyable mais vrai, le code du test dont je viens de donner le lien retourne un résultat faux dans le projet en cours, et un résultat juste si je ferme mon projet et ouvre celui du zip.

    Et pourquoi, me demanderez-vous ?
    Citation Envoyé par bb84000 Voir le message
    Qu'as-tu comme clauses uses ?
    tu l'avais senti ! Bien vu.
    Hé bien, parce que dans le projet sur lequel je travaille, j'y inclus la librairie Bass, dans laquelle on trouve


    Alors pour que le test fonctionne comme il devrait dans mon projet en cours, j'inclus ce type dans la partie implementation de l'unit1, après donc l'inclusion de la librairie Bass, et bingo !

    Donc méfiance de tous les côtés, les copains !

    Quant à ces histoires d'assembleur, tu es au courant qu'il existe un forum spécialisé ? Pas que je veuille te chasser, non, mais l'assembleur c'est tellement spécialisé que les pointures qui s'y trouvent ne sont pas ici.

    (j'avais édité mon post et pendant ce temps vous répondiez, on s'est croisé, du coup je génère plutôt une réponse et j'ai viré mon edit.)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Il y a quand même un truc curieux avec cette histoire. Si je saisis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      i: integer;
      qw: QWord;
    et que je mets la souris sur integer tout en appuyant sur Ctrl, je peux cliquer et je me retrouve dans objpas.pp quelque part dans l'arborescence de fpcsrc.

    Si je fais la même manip avec QWord, il ne se passe rien car il n'y a pas de lien qui s'affiche...

    Comment trouver d'où sort vraiment ce QWord ?

  10. #10
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    Manifestement nous somme en code Lazarus 64 bits. J'aurais tendance à utiliser un peu plus les possibilités qu'il offre.
    Code PASCAL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {$ASMMODE INTEL}
    procedure TForm1.BtnASMClick(Sender: TObject);
    var  Q1, Q2 : UInt64;
    begin
       Q1 := 18446744073709551000;   // Q1 + Q2 = 18446744073709551615 = Max de UInt64 bits
       Q2 := 615;
       Asm
          Mov RAX, Q1
          Add Q2,  RAX
       End;
       Form1.Memo1.Lines.Add('CALCULS EN ASSEMBLEUR');
       Form1.Memo1.Lines.Add('Q1 + Q2 = ' + IntToStr(Q2)); // Accepte directement les UInt64 alias QWord
    end;
    Il faut savoir qu'un double est un flottant sur 64 bits mais qu'il a une mantisse de 52 bits (précision sur 52 bits qu'on peut considérer sur 53 bits car le premier bit est exclu et a priori considéré comme 1). Il y a donc perte de précision si on utilise un double pour caster un UInt64.

    Salutations

  11. #11
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Comment trouver d'où sort vraiment ce QWord ?
    C'est défini au niveau du compilateur (extrait de systemh.inc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type
      { The compiler has all integer types defined internally. Here
        we define only aliases }
      DWord    = LongWord;
      Cardinal = LongWord;
      Integer  = SmallInt;
      UInt64   = QWord;
    Donc, tu ne peux pas retrouver la définition qui doit être dans le code source du compilateur.

    bb84000

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    C'est défini au niveau du compilateur (extrait de systemh.inc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type
      { The compiler has all integer types defined internally. Here
        we define only aliases }
      DWord    = LongWord;
      Cardinal = LongWord;
      Integer  = SmallInt;
      UInt64   = QWord;
    Oui, ça je l'avais très vite trouvé mais c'est exactement l'inverse que j'aimerais voir, parce que là on nous que le UInt64 est du type QWord, ok, mais le type QWord il est défini où ?
    À part admettre qu'un QWord est un double DWord et que celui-ci est un double Word, tout ça est un peu pifométrique, non ?

    Citation Envoyé par bb84000 Voir le message
    Donc, tu ne peux pas retrouver la définition qui doit être dans le code source du compilateur.
    Ben merdum, parce que je voulais m'appuyer là-dessus pour argumenter auprès de Ian de Bass.
    Là, c'est comme partir à la guerre sans munitions, ça ne le fait pas...
    Tout ce que je vais pouvoir lui passer, c'est une image d'une copie d'écran de l'aide, bof, quoi.

    (au fait, tu t'es dépatouillé de ton plantage Linux, on dirait ? )

    ---
    Salut, Yves
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Les helpers ne sont-ils pas disponibles de base, pour qu'il suffise d'écrire ShowMessage(MyQWord.ToString); ?
    Ben si, ça fonctionne, malgré l'engueulade du compilateur :
    Nom : helper.png
Affichages : 416
Taille : 13,6 Ko

    Le message lié à la ligne soulignée en rouge :
    Citation Envoyé par compilo pas content
    Warning: range check error while evaluating constants (-1 must be between 0 and 18446744073709551615)

  13. #13
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour !

    Citation Envoyé par Jipété Voir le message
    (au fait, tu t'es dépatouillé de ton plantage Linux, on dirait ? )
    Voui. Il est sous VMWare, et il ne sert que pour mes tests. J'ai refait une installation neuve, et c'est reparti.

    Citation Envoyé par Jipété Voir le message
    ...ça fonctionne, malgré l'engueulade du compilateur
    Certains compilos (parait-il) ne disent rien, d'après des réponses sur le forum de BASS. Quand même ce n'est pas propre de retourner -1 quand un QWORD ou un DWORD est atendu en retour d'une fonction. Du coup, j'ai modifié mes unités dynamiques BASS en commentant le changement de type et en remplaçant explicitement les QWORD par des int64 (et les DWORD par des LongInt) là où un retour de fonction -1 peut se produire.

    bb84000

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bonsoir,
    Citation Envoyé par Jipété Voir le message
    ...
    Ben merdum, parce que je voulais m'appuyer là-dessus pour argumenter auprès de Ian de Bass.
    Là, c'est comme partir à la guerre sans munitions, ça ne le fait pas...
    Tout ce que je vais pouvoir lui passer, c'est une image d'une copie d'écran de l'aide, bof, quoi.
    J'ai posté cet aprème, et deux heures après, le bigboss himself me répondait, mais il me laisse sur ma faim :
    Citation Envoyé par Ian 2 Bass
    Strictly speaking, UInt64 would be the correct translation of QWORD, but I don't think it'll generally make a big difference if Int64 is used instead. Still, I'm not sure why UInt64 wasn't used in BASS.PAS. Perhaps Int64 was introduced in an earlier Delphi version than UInt64?
    Mais bon, s'il trouve qu'il n'y a pas une grosse différence entre un Int64 et un QWord, je veux bien qu'il me donne un (high)QWord de billets de $1 plutôt qu'un (high)Int64, parce que quand on les met bien alignés, on voit la différence et elle est énorme, du simple au double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Int64 -9223372036854775808..9223372036854775807
    QWord                   0..18446744073709551615
    Bah...
    lien

  15. #15
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Jipété : Une lecture ici, avec le post de Josh qui propose une solution que je viens de tester et qui fonctionne.
    Super Jipété!

    Ok, c'est un miracle et en plus, on peut utiliser Inttostr()!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button2Click(Sender: TObject);
      var Q1 : QWord = ($FFFFFFFFFFFFFFFF);
          Q2 : QWord = ($7FFFFFFFFFFFFFFF);
          Q3, Q4 : QWord;
    begin
      Q3 := 18446744073709550000; // Max QW = 18446744073709551615
      Q4 := 1615;
      memo1.lines.add('Q1 = '+inttostr(QWORD(Q1)));
      memo1.lines.add('Q2 = '+inttostr(QWORD(Q2)));
      memo1.lines.add('Q3 = '+inttostr(QWORD(Q3))+#13#10+'Q4 = '+inttostr(QWORD(Q4)));
      memo1.lines.add('Q3 + Q4 = '+inttostr(QWORD(Q3+Q4)));
    end;
    Résultat:

    Nom : QW1.jpg
Affichages : 432
Taille : 40,2 Ko
    Bah, moi j'ai assez cherché, j'ai ma réponse

  16. #16
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Super Guesset,

    ça marche, enfin en assembleur aussi. Je vais pouvoir me concentrer sur mon projet de départ à base de statistiques...
    Deux solutions trouvées aujourd'hui! C'est Noel avant l'heure, mdr :

    Merci à bb84000 aussi qui a contribué à nos reflexions...

  17. #17
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 935
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Les helpers ne sont-ils pas disponibles de base, pour qu'il suffise d'écrire ShowMessage(MyQWord.ToString); ?
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

  18. #18
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Les helpers ne sont-ils pas disponibles de base, pour qu'il suffise d'écrire ShowMessage(MyQWord.ToString); ?
    Tonnerre de Dieu, comment est-on passé à côté de ça ? Décidément on en finit plus!

    Super Ttourlourou


    Voici les trois solutions:

    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
     
    {3 solutions pour afficher un QWord}
    procedure TForm1.Button2Click(Sender: TObject);
      var Q1 : QWord = ($FFFFFFFFFFFFFFFF);
          Q2 : QWord = ($7FFFFFFFFFFFFFFF);
          Q3, Q4, Q5 : QWord;
    begin
      Q3 := 18446744073709550000; // Max QW = 18446744073709551615
      Q4 := 1615;
      memo1.lines.add('Q1 = '+inttostr(QWORD(Q1)));
      memo1.lines.add('Q2 = '+inttostr(QWORD(Q2)));
      memo1.lines.add('Q3 = '+inttostr(QWORD(Q3))+#13#10+'Q4 = '+inttostr(QWORD(Q4)));
      memo1.lines.add('Q3 + Q4 = '+inttostr(QWORD(Q3+Q4)));
      Q5 := Q3 + Q4;
      ShowMessage(Q5.ToString);
      memo1.lines.add('Q5 = '+Q5.ToString);
    end;
    Une 4ème solution?

    On pourrait peut-être ajouter ces solutions mieux présenté dans la FAQ Lazarus, qu'en pensez-vous? Je voulais éditer un source avec toutes les solutions d'affichage en Lazarus, mais déjà, ça pourrait être utile en l'état!

  19. #19
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 935
    Billets dans le blog
    6
    Par défaut
    Salut JP,
    Le compilo avertit car il interprète un entier tapé en dur comme signé, même s'il est affecté à un entier non signé.
    Il suufit de lui dire ce qu'on veut et plus d'avertissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      MyQWord: UINT64;
    begin
      MyQWord := UINT64($FFFFFFFFFFFFFFFF);
      ShowMessage(MyQWord.ToString);
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Le compilo avertit car il interprète un entier tapé en dur comme signé, même s'il est affecté à un entier non signé.
    Pas toujours, pas toujours, et c'est bien ça le drame et la naissance des embrouilles, des sacs de nœuds et des crashes de fusée Ariane...

    Citation Envoyé par tourlourou Voir le message
    Il suffit de lui dire ce qu'on veut et plus d'avertissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      MyQWord: UINT64;
    begin
      MyQWord := UINT64($FFFFFFFFFFFFFFFF);
      ShowMessage(MyQWord.ToString);
    Admettons, mais pourquoi faut-il que je fasse cette bidouille avec un QWord alors qu'elle n'est pas nécessaire avec un cardinal ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      qw: qword;
      cdl: cardinal = 4294967295;
    begin
      qw := UINT64($FFFFFFFFFFFFFFFF);
      showmessage(qw.ToString);
      showmessage(inttostr(cdl));
      showmessage(cdl.ToString);
    Et j'ai donc 3 ShowMessages qui s'affichent avec les bonnes valeurs et sans warning concernant le qword.
    On ne m'ôtera pas de l'idée qu'il y a anguille sous roche...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Addition et affichage du resultat.
    Par Code Rom dans le forum x86 32-bits / 64-bits
    Réponses: 35
    Dernier message: 09/05/2018, 16h29
  2. [NASM] Addition et affichage des nombres en hexadécimal
    Par arthson dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 18/02/2014, 14h55
  3. [MySQL] MYSQL addition et affichage
    Par Guizmo2000 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 30/01/2013, 10h28
  4. Réponses: 10
    Dernier message: 22/05/2008, 12h29

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