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

Delphi Discussion :

Débordement dans opération de conversion ou arithmétique


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Débordement dans opération de conversion ou arithmétique
    Bonjour,

    J'utilise le code suivant :
    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
     
    function BytesToFriendlyString(Value : DWord) : string;
    const
      OneKB = 1024;
      OneMB = OneKB * 1024;
      OneGB = OneMB * 1024;
      OneTB = OneGB * 1024;
    begin
      if Value < OneKB then
        Result := FormatFloat('#,##0.00 B',Value)
      else
        if Value < OneMB then
          Result := FormatFloat('#,##0.00 KB', Value / OneKB)
        else
          if Value < OneGB then
            Result := FormatFloat('#,##0.00 MB', Value / OneMB)
          else
            if Value < OneTB then
              Result := FormatFloat('#,##0.00 GB', Value / OneGB)
    end;
    Celui-ci me retourne l'erreur suivante à la compilation :
    E2099 Débordement dans opération de conversion ou arithmétique
    A la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OneTB = OneGB * 1024;
    Que dois-je faire pour corriger cette erreur ?
    Quel type de données existe-t-il pour utiliser des nombres assez grand comme dans ce cas ?

    Merci,
    ZiP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 066
    Par défaut
    Aide Delphi :
    DWORD représente un nombre entier non signé de quatre octets
    Utilise donc les Int64 sur ce coup-là :
    Int64 -2^63..2^63-1 64 bits signé
    HTH,
    --
    jp

  3. #3
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    J'ai résolu mon problème avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      OneKB = 1024.0;
      OneMB = OneKB * 1024.0;
      OneGB = OneMB * 1024.0;
      OneTB = OneGB * 1024.0;
    Mais par mesure de sécurité, je vais les passer en Int64.

    Merci,
    Mathieu

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 066
    Par défaut
    J'ai résolu mon problème avec :
    Euh, pas vu de différence avec le post d'origine...

    Mais par mesure de sécurité, je vais les passer en Int64.
    Je l'ai fait après avoir regardé dans le sdk le type de retour d'appels système style "GetFileInfo.FileSize" (pas obligé que ça soit le nom correct [flemme de chercher...], mais c'est l'idée).
    En C, c'est du LARGEINTEGER, qui correspond à l'Int64 de Delphi.
    Dis-toi bien qu'à l'heure actuelle un fichier peut dépasser la taille critique de 2,147_et_quelques Gig, la limite positive d'un Integer.

    Mes 2 cts,
    --
    jp

  5. #5
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Citation Envoyé par Jipété
    Euh, pas vu de différence avec le post d'origine...
    Si si, regarde bien, le '.0' derriere, fait croire que les constantes sont des float, et donc le dépassement n'a plus lieu

    Il y a eu un post il y a pas longtemps à ce sujet, sur les débordements, du à l'opération de 2 nombres non castés, dont le résultat dépassait la capacité dans le type de ces nombres.
    Le ".0" est une solution, mais attention au risque dans les égalités (les float ne sont pas toujours exacts...).

    +1 pour le typage en Int64 qu'incite Jipete
    en partant comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OneKB: Int64 = 1024;
    OneMB: Int64 = OneKb * 1024;
    ...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 066
    Par défaut
    Si si, regarde bien, le '.0' derriere
    Ah oui, bien vu (c'est la cas de le dire, ) TicTacToe. J'ai lu trop vite, comm' d'hab, et comme mathématiquement c'est pareil, mon cerveau en "optimisant", lol, n'a pas vu la différence,

    Et merci pour le point !
    --
    jp

  7. #7
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    J'ai donc ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const
         OneKB: Int64 = 1024;
         OneMB: Int64 = OneKB * 1024;
         OneGB: Int64 = OneMB * 1024;
         OneTB: Int64 = OneGB * 1024;
    (37): E2026 Expression constante attendue
    (38): E2026 Expression constante attendue
    (39): E2026 Expression constante attendue
    Il n'y a que la premiere ligne qui passe. Savez-vous pourquoi ?

    Merci,
    ZiP

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par [ZiP]
    Bonjour,

    J'ai donc ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const
         OneKB: Int64 = 1024;
         OneMB: Int64 = OneKB * 1024;
         OneGB: Int64 = OneMB * 1024;
         OneTB: Int64 = OneGB * 1024;


    Il n'y a que la premiere ligne qui passe. Savez-vous pourquoi ?

    Merci,
    ZiP
    Oui, il en a été question il n'y a pas longtemps (sur le forum Pascal, je crois)

    Le fait est que quand on déclare une constante typée comme tu le fais, eh bien, pour Delphi, ce n'est pas vraiment une constante, c'est une variable initialisée.

    (Essaye d'en déclarer une, et tente de la modifier dans une fonction/procédure, tu verras que ça marche)

    Donc, pour ton problème, pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const
         OneKB: Int64 = 1024;
         OneMB: Int64 = OneKB * 1024;
         OneGB: Int64 = OneMB * 1024;
         OneTB: Int64 = OneGB * 1024;
    ça passe pour OneKB, mais pas pour la suite. Ça ne peut pas compiler, car OneKB n'est pas réellement une constante.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Je comprends le problème, mais, quelle solution adopter ?

    Déclarer chaque variable sans utiliser la précédente ?

    Merci,
    ZiP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 066
    Par défaut
    Soir !

    Comme ça, ça passe, mais attention au fait que du coup tu gagnes des Float
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
         OneKB = 1024.0;
         OneMB = OneKB * 1024.0;
         OneGB = OneMB * 1024.0;
         OneTB = OneGB * 1024.0;
    --
    jp

  11. #11
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Salut,

    J'ai fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const
         OneKB: Int64 = 1024;
         OneMB: Int64 = 1048576;
         OneGB: Int64 = 1073741824;
         OneTB: Int64 = 1099511627776;
    Merci,
    ZiP

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Par défaut
    A tester, mais ça devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const
         OneKB = Int64(1024);
         OneMB = Int64(OneKB * 1024)
         OneGB = Int64(OneMB * 1024)
         OneTB = Int64(OneGB * 1024)
    Citation Envoyé par TicTacToe
    ...
    Le ".0" est une solution, mais attention au risque dans les égalités (les float ne sont pas toujours exacts...).
    Les floats ne sont pas toujours exacts pour les nombres décimaux, mais pas de problèmes pour les entiers (dans la limite de la capacité de la mantisse bien sûr).

  13. #13
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Oui, c'est mieu avec un cast

    Merci,
    ZiP

Discussions similaires

  1. Eliminer les débordements dans la marge
    Par Bktero dans le forum Mise en forme
    Réponses: 8
    Dernier message: 02/09/2009, 14h53
  2. Réponses: 2
    Dernier message: 05/03/2009, 17h55
  3. [XSL-FO] débordement dans tableau
    Par yakup.67 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 31/01/2008, 10h51
  4. Réponses: 0
    Dernier message: 30/05/2007, 17h12
  5. [XSL~FO] Débordement dans une colonne d'un tableau
    Par palmelas dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/01/2007, 21h59

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