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

Free Pascal Discussion :

[Débutant] Runtime error 221 : ranges overrun [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut [Débutant] Runtime error 221 : ranges overrun
    Bonsoir à tous donc comme indiqué dans le titre j'ai un soucis dans l'éxécution de mon programme, il se compile, il se lance, et lorsque je rentre une valeur celui ci plante et me met un message type 'run time error: 221 ranges ovverrun' (j'ai vu un post récent cependant c'est pas l'aide que je désire). J'ai denombreuses fonctions, divers tableau mais j'ai revérifié l'érreur ne peu provenir de la, J'ai un doute et j'aurais besoin de votre aide pour me dire si l'orde est le bon dans une de mes procédure (je pense avoir fais des erreur dans les begin et end)

    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
    procedure centaine(N:integer);
     
    var Dizaine, Reste:integer;                                           
    begin
     
    Dizaine:=trunc(N/10);                                                
      Reste:=trunc((N-TRUNC(N))*100);
      if((Dizaine<>7) or (Dizaine<>9) or (Dizaine<>1)) then                
         begin
          Write(Diz[Dizaine]);                                             
          if((Dizaine<>8) and (Reste=1))then                               
            write('et', Chif[Reste])                                      
            else if(Reste<>0)then                                             
              write(Chif[Reste]);                                        
         end
       else if( (Dizaine=1) or (Dizaine=7) or (Dizaine=9) )then
               begin
               if((Reste>=1) and (Reste<=6))then
                 begin
                   Dizaine:=Dizaine-1;
                   Reste:=Reste+10;
                   if((Dizaine=6) and (Reste=11))then
                      write(Diz[Dizaine],'et',Chif[Reste])
                   else write(Diz[Dizaine],Chif[Reste]);
                  end
     
            else if(Reste<>0)then
                      write(Diz[Dizaine],Chif[Reste])
                 else write(Diz[Dizaine]);
                end;
    END;

    Merci de votre aide

  2. #2
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Oui c'est clair. Voilà ton code proprement tabulé (tout bon éditeur peut le faire pour toi):

    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
    procedure centaine(N:integer);
     
    var Dizaine, Reste:integer; 
    begin
     
      Dizaine:=trunc(N/10); 
      Reste:=trunc((N-TRUNC(N))*100);
      if((Dizaine<>7) or (Dizaine<>9) or (Dizaine<>1)) then 
        begin
          Write(Diz[Dizaine]); 
          if((Dizaine<>8) and (Reste=1))then 
            write('et', Chif[Reste]) 
          else if(Reste<>0)then 
            write(Chif[Reste]); 
          end
        else if( (Dizaine=1) or (Dizaine=7) or (Dizaine=9) )then
          begin
            if((Reste>=1) and (Reste<=6))then
              begin
                Dizaine:=Dizaine-1;
                Reste:=Reste+10;
                if((Dizaine=6) and (Reste=11))then
                  write(Diz[Dizaine],'et',Chif[Reste])
                else write(Diz[Dizaine],Chif[Reste]);
                end
     
              else if(Reste<>0)then
                write(Diz[Dizaine],Chif[Reste])
              else write(Diz[Dizaine]);
              end;
          end;
        end;
    end;
    J'ai rajouté les "end" qui manquaient, à toi de voir s'ils sont à la bonne place!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    je te remercie vraiment bredelet c'est vrai que c'est plus lisible, cependant je ne comprend pas, il y'a 4 begin donc normalement 4 end.. et la il y en a beaucoup plus

  4. #4
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Citation Envoyé par Jérém08 Voir le message
    je te remercie vraiment bredelet c'est vrai que c'est plus lisible, cependant je ne comprend pas, il y'a 4 begin donc normalement 4 end.. et la il y en a beaucoup plus
    J'avais pas fait gaffe, corrigé maintenant.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Encore merci pour ton aide, mais je vois toujours pas trop ou tu veux en venir étant donné que j'avais incorporé mais end dans la procédure, et donc avec les tiens en plus sa en fait beaucoup trop, cela veut dire que les miens sont à retirer? je suis débutant en pascal donc j'apprend encore

    merci comme même et bonne nuit

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    C'est bon j'ai trouvé tu en avais mis deux en trop, j'arrive désormais à compiler et à le lancer mais me reste le problème de ranges over... donc cela vient d'un autre problème, tableau, programme principal, ou autre procédure.. c'est un mystère mais je vais m'y plonger dedans.

  7. #7
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Bon OK en regardant le code lui-même, j'ai quelques questions:

    Quels sont les indices des tableaux Diz et Chif? Est-ce que N est forcément entre 0 et 99?

    Qu'est-ce que ce code est sensé faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Reste:=trunc((N-TRUNC(N))*100);
    Je pense que N-trunc(N) est toujours 0.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Oula c'est assez compliqu, N est un entier compris jusque 1 million, c'est soit la partie entiére d'une somme entré, soit la partie décimale. pour les tableaux Diz comporte 16 cases de STRING avec une taille de 8 caractères max, et Chif comporte 9 case(1à 9) de string avec une taille de 16 caractère max('pour le nombre quatre-vingt-dix'.
    Et ce code pour répondre à ta dernière question est censé convertir un montant tapé en chiffres et le transposé en lettre pour les libélé de chéques, avec les bonnes liaisons avec S ou non pour francs, avec la liaison ou non de 'et' et de 'de', avec le S de franc ou non... sa fais pas mal de temps que je suis sur ce programme je l'ai fini mais me reste ce soucis à régler.

    En tout cas je te remerci de ton aide précieuse

  9. #9
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Puisque N est un entier, trunc(N) a la même valeur que N. Donc N-TRUNC(N) donne toujours zéro et Reste vaut toujours zéro.

    Si N peut aller jusqu'à un million, alors Dizaine peut aller jusqu'à 100000. Donc il y a de bonnes chances que ce code plante:
    Puisque la taille de Diz est seulement 16.

    À mon avis tu devrais tout reprendre du début en pseudo-code avant de te lancer dans Pascal.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    NON NON je suis sur et certain de mon algo, il vient de mon Prof donc je doute pas une seconde, j'avais juste à transposer en pascal...
    Concernant le tableau j'ai par exemple

    type Dizaine = ARRAY [1..9] OF string[16];

    ce qui signifie que j'ai 9 cases que je remplie dans la procédure initialiser comme pour exemple

    Diz[1]:='dix';
    Diz[9]:='quatre-vingt-dix' (ce qui représente bien la valeur 16 car 16 caractère pour string... car valeurs max des cases)

    Donc l'erreur ne viens pas de la. J'ai plus à présent le problème de ranges over... j'ai remplacer une procédure et j'ai modifier tout les integer par des long int (utile pour les millions, j'arrangerais sa plus tard) cependant maintenant j'ai le problème error 215: dans les lignes

    -(M étant un int déclaré dans la procédure, et N déclaré en paramètre, tout deux en longint)

    N:= N-(M * 1000000);

    -(ainsi qu'une erreur dans mon programme principale, en rapport avec la ligne cité plus haut puisque c'est l'appel de cette procédure qui est concerné)

    million(Franc);

    Pense tu savoir d'ou cela peut venir?

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Cao,
    La remarque
    Citation Envoyé par bredelet Voir le message
    Puisque N est un entier, trunc(N) a la même valeur que N. Donc N-TRUNC(N) donne toujours zéro et Reste vaut toujours zéro.

    Si N peut aller jusqu'à un million, alors Dizaine peut aller jusqu'à 100000. Donc il y a de bonnes chances que ce code plante:
    Puisque la taille de Diz est seulement 16.

    À mon avis tu devrais tout reprendre du début en pseudo-code avant de te lancer dans Pascal.
    est parfaitement valide

    Citation Envoyé par Jérém08 Voir le message
    NON NON je suis sur et certain de mon algo, il vient de mon Prof donc je doute pas une seconde, j'avais juste à transposer en pascal...
    Donc tu as mal traduit.

    Citation Envoyé par Jérém08 Voir le message
    Donc l'erreur ne viens pas de la. J'ai plus à présent le problème de ranges over... j'ai remplacer une procédure et j'ai modifier tout les integer par des long int (utile pour les millions, j'arrangerais sa plus tard) cependant maintenant j'ai le problème error 215: dans les lignes

    -(M étant un int déclaré dans la procédure, et N déclaré en paramètre, tout deux en longint)

    N:= N-(M * 1000000);

    -(ainsi qu'une erreur dans mon programme principale, en rapport avec la ligne cité plus haut puisque c'est l'appel de cette procédure qui est concerné)

    million(Franc);

    Pense tu savoir d'ou cela peut venir?
    Quelles valeurs peut prendre M ?

    Sinon, sans le reste du code, difficile de répondre.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Voila la procédure en question: (j'ai des espaces affiché ici cependant il ne se mettent pas quand je l'envoi, et je ne connais pas l'éditeur pour les couleurs veuillez m'en escuser)




    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
    procedure million(N: longint);         
    var M :longint;
     
    begin
     
    if (N>=1000000) then
    begin
     
       M := trunc(N/1000000);
     
       Millier(M);
     end ;
     
    if (M>1) then WriteLn('Millions')
     
      else
          WriteLn('Million');
     
        N:= N-(M * 1000000);
     
      if (N>=1000)then
       begin
          M:= trunc(N/1000);
       if(M>1)then
         millier(M) ;
     
         write('mille');
          N:=N-(M*1000)
       end;
       if(N>=1)then
         millier(N)
     
     
    end;

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bia,

    Pour afficher le code correctement, il faut l'encadrer avec les balises [*code] [*/code], sans les étoiles qui ne servent ici qu'a les désactiver.

    Vu que tu ne donnes pas tout le code...

    ps : au passage, apprend à utiliser l'opérateur mod (modulo) pour avoir le reste, et l'opérateur div pour faire une division entière (ça t'évitera le trunc).
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Citation Envoyé par Jérém08 Voir le message
    NON NON je suis sur et certain de mon algo, il vient de mon Prof donc je doute pas une seconde, j'avais juste à transposer en pascal...
    Même un prof peut se planter parfois. À toi d'être assez malin pour débusquer l'erreur.

    Mais dans ce cas, il est assez clair que tu ne comprends pas suffisament Pascal pour traduire l'algorithme. Je te conseille deux choses:
    1. Vas voir ton prof et pose-lui des questions
    2. Ecris des petits programmes tout bêtes qui vont te servir plus tard, pour voir quel est le résultat

    Par exemple ce programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Program essai1;
    Var N, Dizaine, Reste : longint;
    Begin
      N := 163;
      Dizaine:=trunc(N/10);
      Reste:=trunc((N-TRUNC(N))*100);
      WriteLn('N = ', N);
      WriteLn('Dizaine = ', Dizaine);
      WriteLn('Reste = ', Reste);
    End.
    Ça devrait te donner des idées.
    Aussi, ne compte pas sur les membres du forum pour te résoudre tes devoirs on n'est pas là pour ça.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    Je te remercie j'ai modifier pour toute mes procédure, Pour un exemple cela donne dans une procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Cent:=trunc(N/100);
      Reste:=(N-trunc(N/100)*100);
    Me restent désormais deux petits soucis si tu peux m'indiquer comment puis je résoudre :
    Cela m'indique qu'il y a une erreur sur la ligne ci dessus dans la procédure million.
    Dernier soucis je compren pas comment je pourrais afficher
    Chif[cent] si j'ai par exemple 4980... étant donné que mon tableau est limité, on a tous cette erreur et je vois pas comment je peux faire.

  16. #16
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Cio,

    Comme je l'ai déjà écrit, il faut aussi prendre l'habitude d'utiliser les fonctions ou opérateurs du langage.

    Comme N est un entier, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Cent:=trunc(N/100);
      Reste:=(N-trunc(N/100)*100);
    est avantageusement remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Cent:=N div 100;
      Reste:=N mod 100;
    Quant à ton problème avec
    Citation Envoyé par Jérém08 Voir le message
    N:= N-(M * 1000000);
    quand je t'ai demandé quelles valeurs peut prendre M, ce n'est pas pour le simple plaisir.

    Je soupçonne très fortement un débordement de capacité.

    Et enfin pour
    Citation Envoyé par Jérém08 Voir le message
    Dernier soucis je compren pas comment je pourrais afficher
    Chif[cent] si j'ai par exemple 4980... étant donné que mon tableau est limité, on a tous cette erreur et je vois pas comment je peux faire
    Il faut que ton algorithme ne puisse pas te conduire à cette situation, OU que ton tableau soit fait en conséquence (ce 2ème choix n'étant pas la bonne solution, sans le moindre doute).
    Si les cons volaient, il ferait nuit à midi.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    merci c'est gentil mais comment je dois faire alors pour que cela fonctionne.. parce que bon j'ai du mal à comprendre ce que tu me dis, je suis pas un expert en pascal aprés seulement quelques semaines, et il me reste un jour avant de lui remettre

    merci

  18. #18
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hao,

    Si tu arrives à cette situation, c'est que ton code ne travaille pas correctement (en admettant que l'algorithme su lequel il est basé soit correct).

    Comme il y a peu de calculs : feuille + crayon, et tu l'exécutes manuellement ligne à ligne, en notant toutes les valeurs prises par les variables, ce qui te conduira à l'erreur (ou aux erreurs ).
    Si les cons volaient, il ferait nuit à midi.

  19. #19
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Citation Envoyé par Jérém08 Voir le message
    N:= N-(M * 1000000);

    Cela m'indique qu'il y a une erreur sur la ligne ci dessus dans la procédure million.
    Dernier soucis je compren pas comment je pourrais afficher
    Chif[cent] si j'ai par exemple 4980... étant donné que mon tableau est limité, on a tous cette erreur et je vois pas comment je peux faire
    Dépassement de capacité
    =
    quand le nombre est trop grand pour tenir dans l'espace mémoire prévu par l'ordinateur

    Dans ce cas M * 1000000 est probablement trop grand, es-tu sûr que c'est bien ce que tu veux faire

    Pour le tableau tu devrais vérifier la valeur de l'indice (cent) et si il n'est pas dans la plage de valeurs correcte, signaler une erreur-- je suppose que l'utilisateur a entré un nombre incorrect.

    Bonne chance.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Points : 21
    Points
    21
    Par défaut
    D'accord j'ai compris ce que tu as voulu me dire, il est possible qu'il y ai une erreur dans l'algo que le prof nous à donner mais du coup nous avons tous ce probléme au niveau du débordement, et du stockage dans la variable N.
    N'ayant pas cours aujourd'hui et devant le rendre demain cela signifie que ça ne marchera pas.. c'est pas grave, car je vois pas du tout comment faire pour résoudre sa.

    Encore merci à vous

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/08/2010, 16h20
  2. Réponses: 1
    Dernier message: 23/04/2008, 10h37
  3. [TP]Runtime error 106 à l'exécution
    Par BlackTiger dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/01/2004, 21h50
  4. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 22h53
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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