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

Autres IDE Pascal Discussion :

La fonction Trunc renvoie une erreur "Ranges overrun" [FPS]


Sujet :

Autres IDE Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut La fonction Trunc renvoie une erreur "Ranges overrun"
    Bonsoir,

    Je demande votre aide car je rencontre un soucis avec la fonction Trunc() permettant d'obtenir la partie entière d'un real.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      euro := Trunc(somme);
    La somme étant saisie par l'utilisateur, si elle est (exemple) 1000,25 aucun soucis, par contre si elle dispose de plus de chiffres, le programme plante et me renvoie l'erreur :
    'ranges overrun'

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Quel est le compilateur utilisé ?

    J'ai essayé en vain de reproduire l'erreur en question. Tout ce que j'arrive à obtenir (avec Free Pascal 3.0.0), c'est le message "Invalid floating point operation", et non pas "Ranges overrun".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses
      sysutils;
     
    var
      euro: integer;
      somme: real;
     
    begin
      //ReadLn(somme);
      somme := 10000000000000000000000000000000000;
      euro := Trunc(somme);
    end.
    Autrement "overrun" veut dire dépassement. Ce dépassement semble se produire lors de l'appel de la function Trunc(), ou lors de l'assignation du résultat à la variable euro, je ne sais pas trop.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Voici une façon possible de gérer ce problème.

    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
    uses
      sysutils;
     
    var
      euro: integer;
      somme: real;
      ok: boolean;
     
    begin
      repeat
        Write('Veuillez saisir un nombre : ');
        ok := TRUE;
        try
          ReadLn(somme);
          euro := Trunc(somme);
        except
          on Exception: EInvalidOp do
          begin
            WriteLn('Le nombre est trop grand. Recommencez !');
            ok := FALSE;
          end;
        end;
      until ok;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci mais justement je souhaite pouvoir entrer ce genre de nombre à rallonge.

    Je suis avec FPS0.6.4a, ce n'est pas la bonne version ?

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par coolam Voir le message
    Merci mais justement je souhaite pouvoir entrer ce genre de nombre à rallonge.
    Si le nombre dépasse la capacité du type utilisé pour le représenter, ça ne peut pas fonctionner.

    Citation Envoyé par coolam Voir le message
    Je suis avec FPS0.6.4a, ce n'est pas la bonne version ?
    Ah oui, je vois.

    http://pascal.developpez.com/telecha...il/id/2816/FPS

    Cet éditeur est livré avec une version de FPC un peu ancienne, ce qui explique la différence entre les messages obtenus. Passer à une version plus récente est à envisager, mais ça ne résoudra pas votre problème.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Autre option, utiliser une bibliothèque de ce genre :

    https://github.com/benibela/bigdecimalmath
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Tu veux dire que dans un integer, je ne peux pas mettre un nombre plus grand que 55555 par exemple ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par coolam Voir le message
    Tu veux dire que dans un integer, je ne peux pas mettre un nombre plus grand que 55555 par exemple ?
    Le type integer ou disons plutôt longint est fait pour représenter un nombre entier compris entre -2147483648 et 2147483647.

    http://freepascal.org/docs-html/ref/refsu5.html

    Chez moi le programme suivant s'exécute sans erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uses
      sysutils;
     
    var
      euro: longint;
      somme: real;
     
    begin
      somme := 2147483647;
      euro := Trunc(somme);
    end.
    Mais remarque que la fonction Trunc() renvoie un int64,

    http://www.freepascal.org/docs-html/...tem/trunc.html

    dont la capacité est supérieure à celle du longint. Tu pourrais donc déclarer une variable euro de type int64. Mais ce n'est que reculer le problème.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    Salut

    Une simple recherche sur les types ordinaux t'aurait peut-être aidé :

    Type Range Size in bytes
    Byte 0 .. 255 1
    Shortint -128 .. 127 1
    Smallint -32768 .. 32767 2
    Word 0 .. 65535 2
    Integer either smallint or longint size 2 or 4
    Cardinal longword 4
    Longint -2147483648 .. 2147483647 4
    Longword 0..4294967295 4
    Int64 -9223372036854775808 .. 9223372036854775807 8
    QWord 0 .. 18446744073709551615 8
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Aaaah enfin résolu ! Comme vous me l'avez dit, le integer était trop petit pour contenir le nombre souhaité.
    Je pensais qu'il prenait automatiquement la capacité d'un longint ... Il ne faut pas en vouloir aux étudiants
    Merci a vous, bonne continuation !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Problème : la fonction iserror renvoie une erreur
    Par Library dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 07/04/2009, 16h18
  2. [JVCL] install.bat de JCL renvoie une erreur
    Par Gaadek dans le forum Delphi
    Réponses: 3
    Dernier message: 08/06/2007, 15h56
  3. Fonction qui renvoie une liste
    Par la_praline dans le forum GTK+ avec C & C++
    Réponses: 20
    Dernier message: 20/04/2007, 21h22
  4. [?] Fonction qui renvoie une table
    Par Dimitri_87 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/04/2007, 11h48
  5. Requete sql vers ORACLE qui renvoi une erreur
    Par lilou77 dans le forum Oracle
    Réponses: 7
    Dernier message: 29/01/2007, 09h52

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