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 :

Tri de tableau de chaînes de caractères : erreur d'exécution 202 [TPW]


Sujet :

Turbo Pascal

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Tri de tableau de chaînes de caractères : erreur d'exécution 202
    Ce programme permet de trier un tableau des chaines de caractère selon les deux critères suivants:
    • longuer en premier lieu
    • ordre alphabétique en deuxième lieu

    Lorsque j'execute le programme il m'affiche Runtime error 202 at 0001:0356
    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
    91
    92
    93
    94
    95
    96
    97
     
    Program TriParSelection;
    uses wincrt;
     
    const NMax = 100;
    Type Table=Array[1..NMax]of String;
    var T:Table;
    n:integer;
     
    procedure Saisir(Var n:integer);
    begin
    Repeat 
     Writeln ('donne la taille du tableau ');
     Readln(n);
    until n in [1..NMax];
    end;
     
    procedure Remplir(Var T:Table; n:integer);
    var i:integer;
    begin
    Randomize;
    for i := 1 to n do
             begin
             writeln('donner T[',i,']');
             readln(T[i]);
             end;
     
    end;
     
    Function LMin(T:Table;i,n : integer) :integer;
    var IMin,j:integer;
    begin
    IMin:=i;
    for j := i+1 to n do
    begin
         if (length(T[j])< length(T[IMin]))then IMin :=j ;
    end;
    LMin:=IMin;
    end;
     
    Function ChMin(T:Table;i,n : integer) :integer;
    var IMin,j:integer;
    begin
    IMin:=i;
    for j := i+1 to n do
    begin
         if (T[j]< T[IMin])then IMin :=j ;
    end;
    ChMin:=IMin;
    end;
     
    procedure Permuter(var x,y :String);
    var Aux:String;
    begin
    Aux := x;
    X:=y;
    Y:=Aux;
    end;
     
    procedure Tri_Selection(var T:Table; n:integer);
    var i,pmin,cmin:integer;
    begin
    for i := 1 to n-1 do
    begin
    pmin:=LMin (T,i,n);
    cmin:=ChMin(T,i,n);
    if (T[pmin]<> T[i])then
    Permuter(T[pmin], T[i])
    else if(T[cmin]=T[i])then
    Permuter(T[cmin], T[i]);
    end;
    end;
     
    procedure Afficher(T:Table ; n:integer);
    var i:integer;
    begin
    for i := 1 to n do 
    write(T[i]:7);
    end; 
     
     
    {Programme Principal}
    begin
    Saisir(n);
    Remplir(T,n);
    writeln('le tableau avant tri');
    writeln('**********************************************************');
    Afficher(T,n);
    writeln;
    writeln('**********************************************************');
    Tri_Selection(T,n);
    writeln('le tableau après tri');
    writeln('**********************************************************');
    Afficher(T,n);
    writeln;
    writeln('**********************************************************');
    end.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Quand on lance le programme dans l'IDE de tp7 on a un peu plus d'info (cf capture d'écran).

    Donc ton problème est un débordement de pile dans la fonction Afficher. En gros ton tableau de 100 chaînes de 256 caractères est trop gros pour la pile du DOS.

    3 solutions :
    - Réduire la taille de ton tableau
    - Passer ton tableau par référence (const T: Table)
    - Passer à FreePascal

    Le mieux c'est encore de combiner les solutions 2 et 3. ;-)

    Après avoir corrigé la fonction afficher tu verras que tu as le même problème avec toutes les fonction ou tu passe ton paramètre tableau par valeur.
    Images attachées Images attachées  

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par batyann811 Voir le message
    3 solutions :
    - Réduire la taille de ton tableau
    - Passer ton tableau par référence (const T: Table)
    - Passer à FreePascal

    Le mieux c'est encore de combiner les solutions 2 et 3. ;-)

    .
    Merci batyann811 pour votre réponse
    • - Si je remplace la ligne de déclaration de type Table suivante
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Type Table=Array[1..NMax]of String;
      par
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Type Table=Array[1..NMax]of String[20];
      j'aurais un pb de compilation dans l'instruction d'appel de la procédure Permuter par la procédure Tri_Selection
      - Le passage du tableau par reference génère aussi une erreur de compilation, en plus ca change la structure du prg
      -L'environnement que j'utilise : TPW 1.5 et voilà l'impr écran de l'erreur d'execution
    Images attachées Images attachées  

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Citation Envoyé par Taieb Voir le message
    - Si je remplace la ligne de déclaration de type Table suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type Table=Array[1..NMax]of String;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type Table=Array[1..NMax]of String[20];
    j'aurais un pb de compilation dans l'instruction d'appel de la procédure Permuter par la procédure Tri_Selection
    Tu peux creer un type Mot par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Mot = String[20];
      Table = array [1..100] of Mot;
    Ensuite tu changes l'entête de la procédure permuter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure Permuter(var X, Y : Mot);

    Citation Envoyé par Taieb Voir le message
    - Le passage du tableau par reference génère aussi une erreur de compilation, en plus ca change la structure du prg
    Je ne comprends pas ce que tu veux dire là... Je parlais de changer l'entête de la fonction Afficher par celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure Afficher(const T: Table ; N: integer);
    Sous Turbo Pascal 7 ça marche et je ne vois pas en quoi ça change la structure du programme...

    Tu peux aussi essayer d'augmenter la taille de la pile de ton programme avec cette directive de compilation à placer au début de ton programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {$M 30000, 0, 655360}

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci bien
    Pb résolu avec l'utilisation de type mot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Type mot =String[20];
    et la modification des parmaètres de la fonction Permuter La solution suggérée par batyann811

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 18/07/2007, 09h01
  2. Tableau de chaînes de caractères
    Par sone47 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2007, 14h54
  3. tableau de chaîne de caractères
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 17h23
  4. Tableau de chaînes de caractères
    Par mac1 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2006, 13h18
  5. tri par corrélation entre chaînes de caractères
    Par petitmic dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/09/2005, 15h15

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