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

Delphi Discussion :

Débordement de pile


Sujet :

Delphi

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut Débordement de pile
    Bonjour,
    J'ai un problème de "débordement de pile" et je ne sais pas à quoi c'est dû et ni même comment y remédier.

    Pouvez - vous me dire les principâles raisons de ce problème et comment y remédier ?

    Celà arrive lors d'un traitement qui peut être assez long (ca plante quand le traitement dure + 7 secondes.

    J'ai une procedure récursive (ca viendrait surement de là) ?

    Je copie sous une certaine condition un tableau static
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Var
    T1,T2 : Array [1..30] of Byte;
    Begin
    t1 := t2; //Je ne sais pas si cette méthode est bonne ?
    ....
    Merci d'avance

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    760
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 760
    Points : 499
    Points
    499
    Par défaut
    Un des pieges de la recursivité est de ne pas generer la variable de sortie ( mais je pense que tu dois etre au courant de cela ! lol ) , donc de rester dedant indefiniment et donc peut etre de depasser la pile en fonction de tes actions ,
    Controle que la condition de sortie de la recursivité soit correcte .

    Quand on tableau en general je passe plutot par une boucle pour charger les valeur d'un dans l'autre .

    Bye

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    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 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Salut

    D'accord avec petitcoucou31.
    Avec des routines récursives, considères deux choses:
    - la finitude : il faut garantir que la condition de sortie soit vérifiée à l'exécution après un nombre fini d'appel récursif.

    - l'efficacité : ne pas manipuler trop de variables locales coûteuses en mémoire car ces données sont stockées sur la pile (n'hésites à utiliser des const sur des type record ou des chaînes par exemple). Tu peux aussi dans la mesure du possible remplacer des variables locales de grandes taille par une variable globale (relativement à l'exécution de ta routine).


    cdlt

    e-ric

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Merci à vous deux pour ces explications. Je vais voir celà ce soir après le boulot.

    A+

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    La pile peut aussi être dépassée rien que par l'empilement des adresses de retour lors de l'appel à ta fonction (quand on fait de l'asm on comprend un peu mieux ce genre de choses). Donc si ta fonction s'appelle récursivement trop de fois (si ça dure 7 secondes ça aura déjà eu le temps de s'appeler des centaines de fois !), la pile va certainement déborder.

    Une solution très efficace mais pas toujours facile à implémenter est de modifier ta fonction pour la faire tourner en boucle plutôt qu'en récursif. Un exemple trivial est la fonction Factorielle, codée traditionnellement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Factorielle(Num : Cardinal) : Cardinal;
    begin
      if Num <= 1 then Result := 1 else
        Result := Num * Factorielle(Num1);
    end;
    et que l'on peut transformer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Factorielle(Num : Cardinal) : Cardinal;
    begin
      Result := 1;
      while Num > 1 do
      begin
        Result := Result*Num;
        dec(Num);
      end;
    end;
    C'est plus ou moins clair ?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Haaa au moins là, je commence à comprendre un peu plus. Donc, une requete récursive ne peut pas se r'appeler un grand nombre de fois ?

    Ce que je comprends encore moins, c'est que lorsque mon application s'ouvre --> 2.500 Ko de mémoire utilisé , pendant le traitement , je vois grimper la mémoire jusqu'a 18.000 Ko et Pan !!! Débordement de pile. D'ou provient cette augmentation de mémoire ?

    Est-il bon de modifier la taille de la pile ( Mais ce n'est tj pas celà qui va résoudre mon problème).


    Je vais étudier ta solution de conversion de requête récursive en une simple boucle.

    Merci pour tout.

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Voir aussi le tutoriel
    http://recursivite.developpez.com/

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Merci beaucoup et toutes mes excuses...J'aurais dû regarder celà avant

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    merci !!!

    je viens moi aussi d'etre confronté a " un debordement de pile" et cette discussion va je pense resoudre tous mes problemes !!!

    merci beaucoup a tous ! (meme si la discussion est un peu veille..)

  10. #10
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Ayant déja été confronté au problème, je peux donner une petite précision.

    J'avais une fonction (non récursive) qui acceptait un tableau.
    La taille de mon tableau étant trop grosse, je sortais avec un débordement de pile (sans comprendre pourquoi, n'ayant jamais eu le pb ...)
    Après avoir fuiné dans l'aide de delphi et débuggué l'exécutable (sur l'exe directement), je me suis rendu compte que trop de paramètres étaient poussés sur la pile et -> Paf
    L'aide de Delphi indique la taille maximale de la pile à ne pas dépasser (faut tenter une recherche car je sais plus vraiment ou c'est indiqué ...).
    Je ne crois pas (a vérifier) que cette taille est paramétrable dans les options du projet ...
    Pour ma part, au lieu de passer le tableau, j'ai simplement passé le pointeur sur le tableau, et la ca passait tout seul

    EDIT : /me vient de voir qu'en fait le sujet a été déterré

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/04/2008, 19h20
  2. [WIN32][D7][DLL] Erreur: débordement de pile !
    Par hepha1970 dans le forum Débuter
    Réponses: 5
    Dernier message: 17/12/2007, 01h41
  3. Réponses: 14
    Dernier message: 14/12/2006, 08h34
  4. Débordement de pile
    Par litlebasic dans le forum Delphi
    Réponses: 11
    Dernier message: 29/06/2006, 11h48
  5. Réponses: 7
    Dernier message: 10/01/2006, 20h58

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