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

Turbo Pascal Discussion :

Runtime error 202


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Runtime error 202
    Bonsoir tout le monde

    j'ai besoin d'aide, ce programme ne marche pas : il m'indique runtime error 202
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    program hn;
    uses wincrt ;
    type
    tab=array[1..20]of string;
    var
    t:tab;
    n:integer;
    ch:string;
     
     
     
     
    procedure saisie(var t:tab;var n:integer);
    var
    i:integer;
    begin
    repeat
    writeln('donner n');
    readln (n);
    until n in [5..20];
    for i:=1to n do
    begin 
    repeat
    writeln('donner t[i]',i) ;
    readln (t[i]);
    until length (t[i])<>0;
    end;
    end;
     
     
     
    function fn (t:tab; x:string; n:integer):boolean;
    var
    i:integer;
    begin
    fn:=false;
    for i:=1to n do
    begin
    if
    length (t[i]) <> 0
    then
    begin 
    fn :=true;
    end;
    end;
    end;
     
     
     
     
     
     
     
    procedure tableau(t:tab; n:integer ;var ch:string);
    var
    i,p,j:integer;
    x:string;
    begin
    for i :=1to n do
    begin
    ch:=t[i];
     
      j:=1;
     
    if not (upcase  (ch[j]) in ['A'..'Z'])
    then begin
    repeat
     p:=j;
    delete (ch,p,1);
    j:=j+1;
     
    writeln(ch);
    until (j=length(ch)) or (i=n);
    end;
     
    end;
    if fn(t,x,n) =true
    then
    begin
    writeln (ch,i);
     
    end;
    end;
     
     
     
    begin
    saisie(t,n);
    tableau(t,n,ch);
    end.

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    mmm


    X n'est jamais utilisé ...

    Les variables sont déclarée avant les fonctions, la ou il y a des variables du même nom.

    la fonction "fn" semble très étrange.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    type
      tab = array[1..20] of string;
     
    procedure saisie(var t:tab;var n:integer);
    var
      i:integer;
    begin
      repeat
        write('donner n (de 5 a 20) : ');
        readln(n);
      until n in [5..20];
     
      for i := 1 to n do
      begin
        repeat
          write('donner t[',i,'] : ') ;
          readln(t[i]);
        until length(t[i]) <> 0;
      end;
    end;
     
     
     
    function fn(t:tab; n:integer):boolean;
    var
      i : integer;
    begin
      fn := true;
      for i := 1 to n do
      begin
        fn := fn and (length(t[i]) <> 0);
      end;
    end;
     
    procedure tableau(t:tab; n:integer ;var ch:string);
    var
      i,p,j: integer;
    begin
      for i :=1to n do
      begin
        ch := t[i];
     
        j  := 1;
     
        if not (upcase(ch[j]) in ['A'..'Z']) then
        begin
          repeat
            p := j;
            delete(ch, p, 1);
            j := j + 1;
     
            writeln(ch);
          until (j = length(ch)) or (i = n);
        end;
      end;
     
      if fn(t, n) then
      begin
        writeln(ch,i);
      end;
    end;
     
    var
      t  : tab;
      n  : integer;
      ch : string;
    begin
      saisie(t,n);
      tableau(t,n,ch);
    end.

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut merci bcp pour votre reponse
    J'ai mis votre proposition mais le problème était le même : "error 202".
    Bon j'ai essayé de nouveau :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    program hn;
    uses wincrt ;
    type
    tab=array[1..20]of string;
    var
    t:tab;
    n:integer;
    ch:string;
     
     
     
     
    procedure saisie(var t:tab;var n:integer);
    var
    i:integer;
    begin
    repeat
    writeln('donner n');
    readln (n);
    until n in [2..20];
    for i:=1to n do
    begin 
    repeat
    writeln('donner t[i]',i) ;
    readln (t[i]);
    until length (t[i])<>0;
    end;
    end;
     
     
     
     
     
     
     
    procedure tableau(t:tab; n:integer ;var ch:string);
    var
    i,p,j:integer;
    x:string;
    begin
    for i :=1to n do
    begin
    ch:=t[i];
     
      j:=1;
     
    if not (upcase  (ch[j]) in ['A'..'Z'])
    then begin
     
      p:=j;
    delete (ch,p,1);repeat
    j:=j+1;
     
    writeln(ch);
    until (j=length(ch)) ;
    end;
     
    end;
    for i:=1to n do begin 
    if ch <>''
    then
    begin
    writeln (ch,i);  
     
    end;
    end;
     end;
     
     
    begin
    saisie(t,n);
    tableau(t,n,ch);
    end.
    mais cette fois le programme fonctionne mais il n'efface pas les autres caractères "autres que les lettres" et il m'affiche seulement la dernière case avec son indice.

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Runtime error 200 - Division by zero
    Runtime error 201 - Range check error
    Runtime error 202 - Stack overflow error
    Runtime error 203 - Heap overflow error
    Runtime error 204 - Invalid pointer operation
    Runtime error 205 - Floating point overflow
    Runtime error 206 - Floating point underflow
    Runtime error 207 - Invalid floating point operation
    Runtime error 208 - Overlay manager not installed
    Runtime error 209 - Overlay file read error
    Runtime error 210 - Object not initialized
    Runtime error 211 - Call to abstract method
    Runtime error 212 - Stream registration error
    Runtime error 213 - Collection index out of range
    Runtime error 214 - Collection overflow error
    Runtime error 215 - Arithmetic overflow error
    Runtime error 216 - General protection fault

    Le tout etant de trouver pourquoi. ne sachant pas le resultat à obtenir, chez moi ça compile et ça marche... pas d'erreur.

  5. #5
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    L'erreur qui provoque l'arrêt du programme ( dans la première version ) se situe dans la procédure tableau, entre les lignes 65 et 74.

    Il suffit de faire du pas à pas avec une crayon et une feuille de papier pour réaliser que ce passage est complètement faux.

    Explication de l'erreur dans la première version :

    Si ch[1] est une lettre classique, alors les lignes 66 à 74 ne sont pas exécutées et on passe directement à la ligne 76.
    L'indice i est incrémenté, on revient au début de la boucle, ligne 61, et on passe à la chaîne suivante.
    Pas d'erreur d'exécution dans ce cas.
    ( mais la fonction ne fait pas ce qui était voulu, puisqu'elle n'a examiné que le premier caractère de la chaîne ).

    Si ch[1] n'est pas une lettre classique, alors les lignes 66 à 74 sont exécutées.
    Dans ce cas, le premier caractère de la chaîne ch est supprimé, ce qui modifie la longueur de ch.
    Puis j passe à 2, la chaîne restante est affichée, et j est comparé à la nouvelle longueur de la chaîne.
    Supposons que la chaîne contenait initialement 4 caractères.
    Alors l'indice j ( qui vaut 2 ) est différent de la longueur de la chaîne ( qui vaut maintenant 3 ) et on saute à la ligne 68.
    Le deuxième caractère de la chaîne ch est supprimé, j passe à 3, la chaîne restante est affichée, et j est à nouveau comparé à la nouvelle longueur de la chaîne.
    Cette fois l'indice j ( qui vaut 3 ) est différent de la longueur de la chaîne( qui vaut maintenant 2 ) et on saute à la ligne 68.
    Etc ...
    L'indice j augmente constamment, la longueur de la chaîne diminue constamment, forcément cela finit en catastrophe ...

    Le premier point à céder est sans doute l'instruction writeln(ch) lorsque la longueur de la chaîne est devenue négative.
    Pour savoir quel est exactement la ligne qui produit l'explosion finale, il faudrait avoir plus d'informations que la simple phrase " ce programme ne marche pas : il m'indique runtime error 202 ".
    Par exemple, quelle était la chaîne entrée et combien de fois a-t-elle été affichée avant l'apparition de l'erreur 202.

    Remarquons que déplacer le repeat dans la deuxième version du programme a supprimé l'erreur 202 à l'exécution, mais que le programme reste fondamentalement incorrect.

    En effet :

    Si ch[1] est une lettre classique, l'exécution est la même que ci-dessus, seul le premier caractère de la chaîne est examiné.

    Si ch[1] n'est pas une lettre classique, alors les lignes 48 à 56 sont exécutées.
    Le premier caractère de la chaîne ch est supprimé, puis la chaîne restante est affichée plusieurs fois.
    Il n'y a plus l'erreur 202, mais la fonction ne fait pas ce qui était voulu ...

    Quant à " le programme m'affiche seulement la dernière case avec son indice ", c'est tout simplement parce que l'instruction writeln(ch,i) est placée en dehors de la boucle où i varie.
    Lorsque cette instruction est exécutée, l'indice i a déjà atteint la valeur n et ne bouge plus.

    Cette erreur a moins de risque de se produire lorsque le code est correctement indenté.
    En effet, grâce à l'indentation, les limites d'une boucle sont clairement visibles et on peut se rendre compte qu'un indice est utilisé en dehors de sa boucle.
    Moralité : pour éviter des erreurs, il faut indenter le code .

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 562
    Points : 3 956
    Points
    3 956
    Par défaut
    Stack overflow = sans doute des appels récursifs incontrôlés.

    @+

Discussions similaires

  1. [Turbo Pascal] Runtime error 202
    Par lomlom dans le forum Turbo Pascal
    Réponses: 0
    Dernier message: 19/05/2014, 13h59
  2. [Turbo Pascal] Runtime error 202
    Par sonia17 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 19/05/2013, 15h02
  3. [TPW] Runtime error 202 - Stack overflow error
    Par NMaxis dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 02/02/2009, 13h31
  4. [TPW] Runtime error 202
    Par molesqualeux dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 08/05/2006, 11h15
  5. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 22h53

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