Libére l'espace pointé pascal/delphi

Résolu
fahim0788 Messages postés 111 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,
comment faire en pascal ou delphi pour libérer l'espace mémoire pointé par un pointeur?
Configuration: Windows XP
Internet Explorer 7.0

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    En Pascal :
    new(p); pour demander de la mémoire
    dispose(p); pour libérer la mémoire
    1
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    Pour tes soucis de pile (gestion de la mémoire aujourd'hui, taille d'une pile hier...)
    Voici une unité Pascal contenant quelques fonctions fondamentales sur les piles
    J'espère que ça pourra t'aider (en cas de bug sue une fonction, merci de m'en informer)
    unit UnitePile;
    
    interface
    
    type Elem=integer; // par exemple
    
         Pile=^Niveau;
         Niveau=record
                 e:elem;
                 p:pile;
                 end;
    
    procedure Decapiter(var p:Pile); // supprime le sommet de la pile
    procedure Supprimer(var p:Pile); // supprime toute la pile
    procedure Initialiser(var p:Pile); // associe à p une base de pile
    procedure Empiler(var p:Pile;e:Elem); // rajoute "e" au sommet de la pile
    procedure Depiler(var p:Pile;var e:Elem); // extrait le sommet de la pile
    
    function Sommet(p:Pile):Elem; // accède à l'élément du sommet
    function TaillePile(p:Pile):integer; // donne le nombre d'élément empilé
    
    implementation
    
    const ElemZero=0; // dépend de Elem, utilisé dans Initialiser
    
    procedure Decapiter(var p:Pile);
    var q:Pile;
    begin
    if p<>nil then begin
                   q:=(p^).p;
                   dispose(p);
                   p:=q;
                   end;
    end;
    
    procedure Supprimer(var p:Pile);
    begin
    if p<>nil then begin
                   Decapiter(p);
                   Supprimer(p);
                   end;
    end;
    
    procedure Initialiser(var p:Pile);
    begin
    Supprimer(p); // nécessite que p ai déjà été affecté (nil par exemple)
    new(p);
    (p^).p:=nil;
    (p^).e:=ElemZero;
    end;
    
    procedure Empiler(var p:Pile;e:Elem);
    var q:Pile;
    begin
    q:=p;
    new(p);
    (p^).e:=e;
    (p^).p:=q;
    end;
    
    function Sommet(p:Pile):Elem;
    begin
    result:=(p^).e;
    end;
    
    procedure Depiler(var p:Pile;var e:Elem);
    begin
    e:=Sommet(p);
    Decapiter(p);
    end;
    
    function TaillePile(p:Pile):integer;
    begin
    if p=nil then result:=0
             else result:=TaillePile((p^).p)+1;
    end;
    
    begin end.
    Un programme type avec une pile sera donc :
    program SansNom; uses UnitePile;
    
    var p:Pile;
    begin
    p:=nil; Initialiser(p);
    //...
    Supprimer(p);
    end.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      J'avais initialement compilé mon unité sous Dev-Pascal 1.9.2, mais je l'ai récemment compilé sous Delphi 6 et je me suis aperçu qu'il ne compilait pas donc j'ai rectifié :
      procedure Initialiser(var p:Pile);
      begin
      Supprimer(p); // bah oui, en fait Initialiser(p) sert à rien... désolé !
      end;
      
      procedure Empiler(var p:Pile;e:Elem);
      var n:niveau;
      begin
      n.e:=e;
      n.p:=p;
      p^:=n;
      end;
      0
  3. fahim0788 Messages postés 111 Statut Membre 10
     
    c'est exactement ce que j'ai besoin pour ajouter des piles au programme, merci pour votre aide.
    0