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 :

Il sort de ma fonction r�cursive trop t�t.


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Invit�
    Invit�(e)
    Par d�faut Il sort de ma fonction r�cursive trop t�t.
    Salut j'ai cod� une fonction pour recherch� un composant dans un arbre :
    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Node* Node::find(LightComponent* component) {
                    std::cout<<"component : "<<this->component<<" component : "<<component<<std::endl;
                    if (this->component == component)
                        return this;
                    std::cout<<"size : "<<nodes.size()<<std::endl;
                    for (unsigned int i = 0; i < nodes.size(); i++) {
                        return nodes[i]->find(component);
                    }
                }
    Mais j'ai un probl�me.
    J'ai ajout� deux noeud au noeud racine et voil� ce que �a me fait :
    -Appel de la m�thode find sur le noeud racine en lui passant le composant du deuxi�me noeud enfant.
    -Test si les composant sous les m�me. (non le composant du noeud racine n'est pas celui du deuxi�me noeud enfant.
    -Entr�e dans la boucle for. (size vaut deux car il y a deux noeud enfants.
    -Appel r�cursif de find sur le premier noeuds enfant.
    -Test si les composants ne sont pas les m�me. (non le composant du premier noeud enfant n'est pas celui du deuxi�me noeud enfant.
    Je m'attendais � ce qu'il sorte de la fonction r�cursive et retourne dans la boucle for pour it�rer sur le noeud suivant.
    Mais ce n'est pas ce qui se passe!!!
    Il sort de la boucle for et puis de la fonction en retournant null et �a plante!
    Pourquoi il ne continue pas dans ma boucle for ?

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Parce que return a toujours voulu dire sortir de la fonction et jamais de continuer une boucle.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    J'ai enlev� le return dans la boucle for et l� il continue.
    Mais la fonction me retourne null.
    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #0 0x8094d8c	std::vector<std::unique_ptr<odfaeg::graphic::gui::Node, std::default_delete<odfaeg::graphic::gui::Node> >, std::allocator<std::unique_ptr<odfaeg::graphic::gui::Node, std::default_delete<odfaeg::graphic::gui::Node> > > >::size(this=0x14) (/usr/include/c++/4.9/bits/stl_vector.h:655)
    #1 0x8094cd7	odfaeg::graphic::gui::Node::getNodes(this=0x0) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/GUI/node.cpp:112)
    #2 0x8053e29	ODFAEGCreator::showProjectsFiles(this=0xbffff490, label=0x8e5cdb8) (/home/laurent/Développement/Projets-c++/ODFAEGCREATOR/application.cpp:194)
    #3 0x8066d64	odfaeg::core::DynamicWrapper<void, ODFAEGCreator<odfaeg::graphic::gui::Label*> >::operator()<ODFAEGCreator<odfaeg::graphic::gui::Label*&> >(this=0x8e93788, o=0xbffff490) (/usr/local/include/odfaeg/Core/fastDelegate.h:309)
    #4 0x8065f9e	std::_Function_handler<void (ODFAEGCreator*&, odfaeg::graphic::gui::Label*&), odfaeg::core::DynamicWrapper<void, ODFAEGCreator<odfaeg::graphic::gui::Label*> > >::_M_invoke(std::_Any_data const&, ODFAEGCreator*&, odfaeg::graphic::gui::Label*&)(__functor=..., __args#0=@0x8e937ac: 0xbffff490, __args#1=@0x8e9379c: 0x8e5cdb8) (/usr/include/c++/4.9/functional:2039)
    #5 0x80697a6	std::function<void (ODFAEGCreator*&, odfaeg::graphic::gui::Label*&)>::operator()(ODFAEGCreator*&, odfaeg::graphic::gui::Label*&) const(this=0x8e9375c, __args#0=@0x8e937ac: 0xbffff490, __args#1=@0x8e9379c: 0x8e5cdb8) (/usr/include/c++/4.9/functional:2440)
    #6 0x80687f3	odfaeg::core::FastDelegateImpl<void, ODFAEGCreator*, odfaeg::graphic::gui::Label*>::call<0u, 1u, void*&, void*&, void*&, void*&>(this=0x8e93758) (/usr/local/include/odfaeg/Core/fastDelegate.h:480)
    #7 0x8067fd4	odfaeg::core::FastDelegateImpl<void, ODFAEGCreator*, odfaeg::graphic::gui::Label*>::operator() (this=0x8e93758, p0=0x0, p1=0x0, p2=0x0, p3=0x0) (/usr/local/include/odfaeg/Core/fastDelegate.h:449)
    #8 0x80fe276	odfaeg::core::FastDelegate<void>::operator()<>() const(this=0x8de9e20) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/../../../include/odfaeg/Core/fastDelegate.h:552)
    #9 0x80fd7bf	odfaeg::core::Command::operator() (this=0x8de9e1c) (/home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Core/command.cpp:86)
    #10 0x806a58e	odfaeg::core::Listener::processEvents(this=0x82c8d18) (/usr/local/include/odfaeg/Core/listener.h:126)
    #11 0x806ab1d	odfaeg::core::Application::render(this=0xbffff490) (/usr/local/include/odfaeg/Core/application.h:128)
    #12 0x806a8a6	odfaeg::core::Application::exec(this=0xbffff490) (/usr/local/include/odfaeg/Core/application.h:82)
    #13 0x806a13c	main(argc=1, argv=0xbffff634) (/home/laurent/Développement/Projets-c++/ODFAEGCREATOR/main.cpp:7)

    Pourtant c'est impossible que le pointeur this soit null dans la classe de l'objet il doit toujours point� sur l'objet en cours.
    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Node* node = rootNode->find(label);

  4. #4
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Tu ne voudrais pas stocker le r�sultat d'appel du sous-noeud pour retourner SSI le r�sultat est non null plut�t ?
    Et pr�voir de renvoyer null si rien n'est trouv� au passage...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Node* Node::findNode(LightComponent* component) {
                    if (this->component == component) {
                        return this;
                    }
                    for (unsigned int i = 0; i < nodes.size(); i++) {
                        nodes[i]->findNode(component);
                    }
                    return nullptr;
                }

    Oui mais ce n'est pas normal que m�me si il le trouve la fonction me retourne null.

  6. #6
    Invit�
    Invit�(e)
    Par d�faut J'ai trouv�!
    Il fallait en effet test� si le sous noeud ne renvoyait pas nullptr.
    Sinon la fonction renvoyait nullptr c'est donc pour �a que �a plantait.
    Code cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Node* Node::findNode(LightComponent* component) {
                    if (this->component == component) {
                        return this;
                    }
                    for (unsigned int i = 0; i < nodes.size(); i++) {
                        if(nodes[i]->findNode(component) != nullptr)
                            return nodes[i]->findNode(component);
                    }
                    return nullptr;
                }

  7. #7
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Le double appel � une fonction r�cursive est un bon moyen de tuer ses perfs pour rien.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [VB6] XML, fonction r�cursive de recherche
    Par kboo dans le forum VB 6 et ant�rieur
    R�ponses: 3
    Dernier message: 24/04/2006, 21h27
  2. Fonction file() trop lente
    Par Gwipi dans le forum Langage
    R�ponses: 1
    Dernier message: 19/04/2006, 16h44
  3. [XSLT] fonction r�cursive � N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    R�ponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction r�cursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    R�ponses: 1
    Dernier message: 23/12/2005, 10h08
  5. Probl�me de fonction r�cursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    R�ponses: 1
    Dernier message: 05/12/2005, 13h12

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