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++ Discussion :

[Syntaxe] Probleme Fonction Recursive C++


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [Syntaxe] Probleme Fonction Recursive C++
    Voici un ptit code (test.cpp) qui me laisse perplexe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void test(int& n)
    {
       n++;
       if (n<1000000)
          test(n);
    }
     
    int main (int argc,char* argv[])
    {
       int n = 0;
       test(n);
    }

    ==> g++ test.cpp
    ==> a.out
    ==> segmentation fault

    si je diminue la condition d'arret a 100000, ca marche.
    Je ne comprend pas pourquoi ca plante avec 1000000.
    Quelqu'un sait? Merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par selimen
    si je diminue la condition d'arret a 100000, ca marche.
    Je ne comprend pas pourquoi ca plante avec 1000000.
    Quelqu'un sait? Merci
    Dépassement de la pile. Tu ne peux pas faire autant d'appels récursif que tu voudrais. Chaque appel utilise un peu de mémoire, du coup, dès qu'il y en a trop, cela termine par utilisé toute la mémoire et on arrive au segmentation fault...

    Jc

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Pour eviter ce probleme, tu peut faire en truc dans ce genre :

    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
    bool test(int& n)
    {
       n++;
       if (n<1000000)
           return true;
       else
           return false;
    }
     
    void recursifPleinDeFois(int &n)
    {
       while (test(n) == false)
       {
          // On fait rien
       }
    }
    En gros, ça revient à mettre la condition d'arrêt de ta recursivité dans une boucle.

    C'est moins pratique à coder, mais des fois on a besoin de recursivité vachement grande...

  4. #4
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Ouais, enfin là, on est en situation de récursivité terminale, le compilateur si tu le met en mode optimisé il ne devrait plus donner de dépassement de pile.

    Tiens, question : est-ce que c'est dans la norme C++ que chaque appel de fonction doit être réellement effectué ? (en gros, est-ce que c'est spécifié que chaque appel de fonction utilise la pile système...)
    Je crois pas, si on prend l'exemple des fonctions inline.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci bien pour votre aide. J'avais besoin d'une autre solution car meme en mode optimisé, je depasse la limite

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par HanLee
    Tiens, question : est-ce que c'est dans la norme C++ que chaque appel de fonction doit être réellement effectué ? (en gros, est-ce que c'est spécifié que chaque appel de fonction utilise la pile système...)
    Absolument pas. Le C++ est implementable sur une machine n'ayant pas de pile systeme.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Version non-récursive simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void test(int& n)
    {
       do
       {
          n++;
       }
       while(n<1000000);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 27/04/2008, 14h22
  2. probleme fonction recursive
    Par radouane_as dans le forum C
    Réponses: 11
    Dernier message: 04/05/2007, 21h41
  3. [XSL]Probleme fonction recursive
    Par Le-Cortex dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 12/12/2005, 15h10
  4. probleme sql, fonction recursive
    Par CaptainChoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2005, 01h45
  5. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52

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