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

C++Builder Discussion :

Appels récursifs et stack overflow


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut Appels récursifs et stack overflow
    Bonjour,

    j'ai un problème dans un algorithme récursif.

    j'ai une fonction qui s'appelle elle-même un nombre assez important de fois jusqu'à ce qu'elle trouve ce qu'elle recherche.

    Le problème c'est que je me retrouve avec un "le projet machintruc.exe a provoqué une classe d'exception EStackOverflow avec le message 'Débordement de pile' "

    Est-il possible d'augmenter la taille de la pile et si oui jusqu'à combien et surtout ... où est-ce que ça se trouve ??? dans les options de compilation ? je n'ai rien trouvé :o

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    As tu bien vérifier que ta condition d'arrêt de ta fonction récursive est correct?

  3. #3
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Citation Envoyé par sat83 Voir le message
    As tu bien vérifier que ta condition d'arrêt de ta fonction récursive est correct?
    Pour être franc je me suis dis que si j'augmentais la taille de la pile de manière assez importante et que j'avais toujours le stack overflow c'est que ma condition d'arrêt est foireuse :p (c'est un moyen de vérifier cela ^^')

    Donc j'ai pris le problème à l'envers, mais je vais regarder effectivement il faut mieux faire l'inverse.

    Je vérifie ce point et j'édite mon message pour donner la réponse ^^'

    Edit : Effectivement ma récursivité ne s'arrete jamais donc c'est pour cela que j'ai un stack overflow pour l'instant.


    Mais est-il tout de même possible d'augmenter la taille de la stack (en prévision de la future stack overflow que j'aurai de toute façon même après avoir corrigé le bug de la condition de sortie ) ?

  4. #4
    Membre très actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Par défaut
    Bon ma condition de sortie était foireuse et effectivement c'est bien cela qui me provoquait un stack overflow.
    Mais par la suite même en empilant pas mal de récursivité je ne suis pas arrivé au stack overflow donc je pense que la stack est assez grosse.

    Je mets le sujet en résolu mais je suis cependant toujours preneur de l'info sur la taille maxi de la stack sur le borland, et sur comment le modifier si quelqu'un l'a.*

    Merci !

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Le sujet a beau être résolu, quelques conseils supplémentaires ne font jamais de tord

    De manière générale, il est toujours préférable de choisir la solution qui consiste à s'assurer que la logique suivie (ici, la condition de sortie de la récursivité) soit correcte plutôt que d'envisager des "palliatifs" qui consistent à modifier la taille de la pile ou autres "idioties" du genre.

    Si je parle d'idioties, c'est à dessein: tu ne fera jamais que "reculer pour mieux sauter".

    En effet, si - par malchance - le fait d'augmenter la pile t'évite le "plantage" de l'application, cela ne fait que résoudre *très temporairement* le problème: la charge de travail en période de production étant bien souvent plus importante qu'en période de développement, ton application risque très fort... de planter lorsqu'elle sera en prod, avec des conséquences bien pire que le fait de perdre 2 heures à trouver l'origine d'un bug

    D'un autre coté, si j'admets parfaitement l'idée des fonctions récursives (je suis sans doute l'un des rares qui n'en ait absolument pas peur et qui plaide pour leur utilisation), il est quand même toujours bon de rappeler que cette technique doit être utilisée avec parcimonie: Ce n'est pas parce qu'on peut l'utiliser (car on peut l'utiliser en remplacement d'une boucle "classique") qu'il faut l'utiliser.

    Bien souvent, s'il y a "facilement" moyen d'arriver au résultat en utilisant une boucle "classique", c'est qu'il est fortement préférable... d'utiliser cette boucle classique (par boucle "classique", j'entend les boucle pour, tant que et jusqu'à: for(...;...;...), while(...) et do{}while(...) )

    Je ne sais pas sur quoi tu travaille, et je n'ai donc absolument pas la prétention de dire que tu utilises la récursivité à mauvais escient, mais, es-tu sur que tu te trouve effectivement dans une situation où c'est la meilleure (ou à défaut, la moins mauvaise) des solution

    Enfin, parce qu'une "piqure de rappel" n'est jamais inutile, n'oublie pas que, la règle de base, lorsque tu travaille sous forme récursive, c'est de tester "le cas de base", autrement dit de tester le cas dans lequel il n'y a plus d'appel récursif de la fonction.

    Le reste de la logique aura alors pour but de veiller à "tendre vers le cas de base"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    D'un autre coté, si j'admets parfaitement l'idée des fonctions récursives (je suis sans doute l'un des rares qui n'en ait absolument pas peur et qui plaide pour leur utilisation),
    Tu fais comment pour dénombrer les "rares" ?
    A l'aide d'un raisonnement ad hoc ?

    A plus !

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

Discussions similaires

  1. Appels récursifs et position du pointeur stack
    Par lautrec1 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2014, 18h40
  2. Stack OverFlow
    Par Goundy dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2005, 21h35
  3. [onresize] appels récursifs
    Par pmartin8 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/12/2005, 21h15
  4. Problème de stack overflow
    Par heider dans le forum Langage
    Réponses: 13
    Dernier message: 22/09/2005, 19h50
  5. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16

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