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

Langage Delphi Discussion :

Procédure récursive et pointeurs


Sujet :

Langage Delphi

  1. #1
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut Procédure récursive et pointeurs
    Bonjour,

    Une procédure récursive utilise des pointeurs typés sur une "class".
    Après initialisation par New puis création et utilisation si je détruit
    le pointeur par Dispose j'obtiens une erreur EAccesViolation.

    En définitive ma procédure ne fonctionne sans problème que si je ne détruit pas les pointeurs ?

    Comment peut on résoudre ce dilemme ?

    PL

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Pourrais-tu être un peu plus spécifique? montrer un bout de code?

    D'une manière générale, pour manipuler un objet, il vaut mieux utiliser les constructeurs/destructeurs pour l'allouer/le désallouer.

    Quel bout de code fait l'allocation et la désallocation? Si c'est ta fonction récursive, fais bien attention à ne pas désallouer 2 fois le même objet.
    *LeGEC*

  3. #3
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par paulfr Voir le message
    Une procédure récursive utilise des pointeurs typés sur une "class".
    le instance de classe sont deja des pointeurs, il n'est peut etre pas necessaire de les re-referencer. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      x: TStringList;
    begin
      x := TStringList.Create;
      // ici, x est une reference vers la memoire de l'objet (en gros, l'equivalent d'un pointeur sur un record)

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Une procédure récursive utilise des pointeurs typés sur une "class".
    Inutile, toutes les variables de type objets sont déjà des références (pointeurs) sur des instances de classe.

    Après initialisation par New
    New n'initialise pas, il alloue de la mémoire en fonction du type pointeur.

    puis création et utilisation si je détruit
    le pointeur par Dispose j'obtiens une erreur EAccesViolation.
    Les objets se créent en utilisant le constucteur Create, pas à travers des pointeurs typés.
    "It's more fun to compute !"

  5. #5
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut [delphi4]proc. récursive - compléments
    Bonjour

    Je constate que ma question etait trop succinte, pas suffisamment explicite.
    Le contexte d'utilisation des pointeurs se faisant dans un arbre binaire.
    J'indique donc, ci-dessous, le code limité au strict nécessaire pour la compréhension.

    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
    interface
    type
      ...
      FContenu = record
        case tip : TypeNoeud of
          CTE       : (Valeur : Txy);
         ...
      end;
     
      PtrFonc = ^TFonc;
      TFonc   = class   //object
      public
        Gauche, Droite : PtrFonc;
        v              : FContenu;   // record
        Function ...
         ...
        Function CreeArbre(ch : string) : boolean;
      Private
     
      end;
     
    implementation
    ....
    Function TFonc.CreeArbre(ch : string) : boolean;
    var
       ...
       p1, p2   : PtrFonc;
     
    procedure Coupe(c : string; ...);
    var S : string;
    begin
       new(p1);
       p1^ := TFonc.Create;   // ( create est héritée)
       gauche := p1;
       v.tip := ...
       ...
       CreeArbre := gauche^.CreeArbre(c);
    end;
      ....
    //   P1.Free;  p2.Free;   ////////////////////  Free -> ERREUR
    end;
     
    begin      // CreeArbre
       //                 
       CreeArbre := false;  
       ....
       if ch[1]= ... then begin
                            Coupe(copy(ch,2,lon-1),...);
                            exit;
                         end;
      ....
       end;
    Une autre procédure, semblable à 'coupe' utilise les pointeurs p1 et p2.

    Merci pour vos participations.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      PtrFonc = ^TFonc;
      TFonc   = class   //object
      public
        Gauche, Droite : PtrFonc;
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      TFonc   = class   //object
      public
        Gauche, Droite : TFonc;
    La deuxième forme est beaucoup plus cohérente et évite de faire toutes tes indirections susceptibles d'erreur. Et Gauche reste un pointeur sur l'instance de classe TFonc.
    "It's more fun to compute !"

  7. #7
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut [D4]Procédure récursive
    Bonnjour,

    Suivant les indications de REISUBAR j'ai pu supprimer les pointeurs
    et régler ce probléme.

    Merci pour votre intervention.
    PL

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/12/2009, 12h04
  2. Réponses: 2
    Dernier message: 29/05/2008, 10h53
  3. Procédure récursive nb max d'appel
    Par Fred29 dans le forum SQL
    Réponses: 1
    Dernier message: 08/05/2008, 08h53
  4. [VB] Organigramme d'une procédure récursive.
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/11/2005, 10h53
  5. Procédure Récursives
    Par DocCoinCoin dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 30/10/2002, 19h27

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