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 :

Évaluation d'une expression arithmétique [Turbo Pascal]


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Par défaut Évaluation d'une expression arithmétique
    Bonjour à tous,

    tout d'abord merci pour le temps que vous voulez bien me consacrer afin de lire mon message et je l'espère d'y répondre.
    J'ai écrit un programme qui permet d'évaluer une expression arithmétique post-fixée a l'aide d'une pile d'entiers ; l'erreur 216 apparaît. Je vous poste mon code ci-dessous :
    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 poste_fixee;
    type pile=^noeud;
         noeud=record
         val:integer;
         suiv:pile;
         end;
     
     
    procedure empiler(var e:integer;p:pile);
    var k:pile;
    begin
    new (k);
    k^.val:=e;
    k^.suiv:=p;
    p:=k;
    dispose(k);
    end;
     
    function depiler(p:pile):integer;
    var t:integer;
    begin
    t:=p^.val;
    depiler:=t;
    p:=p^.suiv;
    end;
     
    function conversion(var c:char):integer;
    var t:char;
    begin
    t:=c;
    if (t='0') then  conversion:=0 else
    if(t='1') then conversion:=1 else
    if(t='2') then conversion:=2 else
     if(t='3') then conversion:=3 else
     if(t='4') then conversion:=4 else
     if(t='5') then conversion:=5 else
      if(t='6') then conversion:=6 else
      if(t='7') then conversion:=7 else
      if(t='8') then conversion:=8 else
    conversion:=9
    end;
    procedure  somme(p:pile);
     
     var x,y,s:integer;
     begin
     x:=depiler(p);
     y:=depiler(p);
     s:=x+y;
     empiler(s,p);
     end;
     procedure multiplication(p:pile);
     var x,y,s:integer;
     begin
     x:=depiler(p);
     y:=depiler(p);
     s:=y*x;
     empiler(s,p);
     end;
     procedure affiche_sommet(p:pile);
     
     begin
     writeln('le resultat de l operation est:',p^.val);
     end;
     
     function nbr_char(x:string):integer;
      var i:integer;
      begin
      i:=0;
      while (x[i]>chr(0)) do
      begin
      i:=i+1;
      end;
      nbr_char:=i-1;
      end;
     
     
     var c:string[20];n,i,k:integer;p:pile;
     
     begin
    write('entez l operation post_fix‚e svp:');
     readln(c);
     n:=nbr_char(c);
     p:=nil;
     for i:=1 to n do
     begin
     if (c[i] in ['0' ..'9']  then
        begin
         k:=conversion(c[i]);
         empiler(k,p);
         end
      else if (c[i]='+') then somme(p)
      else
      multiplication(p);
      end;
    affiche_sommet(p);
      readln;
      end.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Bonjour

    En cherchant d'abord ce qui signifie l'erreur 216, vous sauriez eu une piste (la programmation nécessite une certaine curiosité...), Il s'agit d'une faute de protection générale (cf Run-time errors), cela est suffisant pour avoir une idée du problème : dans la procédure Empiler, vous allouez de la mémoire pour stocker la valeur paramètre mais vous la désallouez aussitôt, tout pointeur sur cette zone de mémoire devient illico une référence invalide. Par contre dans Depiler, vous ne désallouez pas la mémoire et c'est bien là qu'il faudrait le faire. De plus vous altérer la pile en local sans prendre la peine de passer son adresse, donc les modification que vous réaliser dessus sont perdues après l'appel à Empiler et Depiler.

    Ca fait pas mal de petite choses à revoir et je pense qu'une relecture (comprise) de vos cours (ou des tutos disponibles dans le forum) au sujet de la gestion dynamique de la mémoire vous fera le plus grand bien.

    Rem : je n'ai pas cherché d'autres erreurs, à bon entendeur, salut...

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Par défaut
    merci pour votre conseille sa ma bien aider

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

Discussions similaires

  1. [Turbo Pascal] Évaluation d'une expression arithmétique
    Par billel0.9 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 13/04/2014, 15h43
  2. Réponses: 8
    Dernier message: 15/05/2007, 11h02
  3. Réponses: 1
    Dernier message: 09/12/2006, 10h13
  4. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25
  5. Réponses: 10
    Dernier message: 18/11/2004, 23h12

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