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 :

Test limite QWord et/ou Transformer un Extended en QWord


Sujet :

Lazarus Pascal

  1. #1
    Membre averti
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 314
    Points : 355
    Points
    355
    Par défaut Test limite QWord et/ou Transformer un Extended en QWord
    Bonjour,

    Je teste une limite dans une fonction qui ne doit pas dépasser la valeur d'un QWord, soit 18 446 744 073 709 551 615.

    Voici la fonction qui plante sur la dernière ligne de result et qui devrait également planter sur l'instruction Limite := QWord(Trunc(ResVal)) qui utilise également Trunc(ResVal)!;

    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
     
    {--- fCellMax ------------------------------------------------------------------
    Les limites (nombre maximum de la population des cellules identifiables de manière
    unique sont celles du type des varaibles X,Y,Z et T selon la dimension
    Si l'on prend une seule limite et que l'on prend :
    1. Type Word pour X,Y,Z, T
        => Limite Max = 65535×65535×65535×65535 = 1 853 020 188 851 841;
        => c'est donc un UInt64 ou un QWord =  0 .. 18 446 744 073 709 551 615
        => Le Longword n'est pas assez grand : (0 .. 4 294 967 295)
    -------------------------------------------------------------------------------}
    function fCellMax(aDim : Tdim) : QWord;
      var Limite : QWord;
        ResVal   : Extended;
        Fmt      : string;
    begin
      result := 0;
      ResVal := IntPower(65535, 4);
     
      {Vérification limite du Qword}
      if (ResVal < 0) or (ResVal > High(QWord)) then
         begin
           Limite := QWord(Trunc(ResVal));
           Fmt    := Format('%d', [Limite]); // Afficher sans décimales
           MessageDlg('Dépassement des limites du nombre de cellules individuelles : ' +
                     Fmt + #13#10 + 'Valeur Maximale autorisée = 1 853 020 188 851 841'
                     , mtError, [mbOk], 0);
           exit;
         End;
      Result := Trunc(ResVal);
    end;
    L'erreur à l'exécution est :

    Nom : Aide 26.jpg
Affichages : 46
Taille : 31,7 Ko

    Note : Je souhaite un résultat numérique et non pas un string qui a déjà été suggéré sur ce site!

    merci
    Je programme en Lazarus 3.4 sous windows 10 pro

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 362
    Points
    11 362
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Si je reprends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    18 446 744 073 709 551 615 = High(QWord)
    18 445 618 199 572 250 625 = 65535 ^ 4
     9 223 372 036 854 775 807 = High(int64)
         1 853 020 188 851 841 = limite max <> 65535^4
    Il est à mon avis impossible de comparer fiablement en faisant autant de conversions entre types : Trunc renvoie la partie entière d'un Float dans la limite d'un Int64.
    Enfin, tu fais un test sur une constante, évalué toujours faux, donc le compilateur omet probablement le code conditionnel, puisque inutile, et l'erreur se manifeste sur la seule expression compilée.
    Je ne conçois pas de solution en dehors des bibliothèques de calculs sur grands entiers.
    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 !

  3. #3
    Membre averti
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 314
    Points : 355
    Points
    355
    Par défaut
    Merci tourlourou,

    Oui, merci Tourlourou, je suis d'accord avec ton analyse! Je pensais que je pouvais utiliser Trunc..., Mais il détecte l'erreur effectivement avant...
    J'avais pensé qu'il y aurait peut être une astuce! De toute façon, cette fonction n'est utilisée que pour un paramétrage, donc pas de problème de temps d'exécution...
    Je vais donc faire des comparaisons de String des valeurs et ne faire le calcul et la conversion qu'après validation si je suis en dessous des limites.

    A+
    Je programme en Lazarus 3.4 sous windows 10 pro

Discussions similaires

  1. Limitation boucle de test
    Par AzelRoth dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 26/03/2009, 16h59
  2. [JUnit] Limites lors de tests JUnit
    Par Clorish dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 22/02/2009, 23h01
  3. [test] Limites des outils Jmeter , JUnit, PhpUnit ?
    Par foufa007 dans le forum Outils
    Réponses: 5
    Dernier message: 19/06/2007, 11h12
  4. Réponses: 1
    Dernier message: 17/06/2006, 09h08
  5. transformation xhtml->xml (choose|if test)?
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/06/2005, 10h46

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