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 :

Sortie fonction récursive


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Sortie fonction récursive
    Salut à tous,
    Je débute en C et j’ai écris la petite fonction suivante dont le but est d’explorer tous les éléments children jusqu’à trouver celui dont le tag correspond à ce que je recherche. Lorsqu’elle le trouve je voudrais que la fonction se termine directement et retourne l’adresse de l’élément recherché….

    Qui peut me dire comment forcer la fonction à stopper brutalement ?

    Merci
    Pierre



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct basicxmlnode * FindNode(struct basicxmlnode *startnode,char *nodename)
    {
    	int i=0;
    	while(startnode->children[i]){
    		if(!strcmp((startnode->children[i]->tag),nodename)){
    			return startnode->children[i];
    			break;
    		}
    		FindNode(startnode->children[i],nodename);
    		i++;
    	}
    }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    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
     
    int FindNode(struct basicxmlnode *startnode,char *nodename, struct basicxmlnode **child)
    {
    int s=0;
    int i = 0 ;
     
     while ( startnode->children[i] )
       {
          if ( strcmp((startnode->children[i]->tag),nodename) == 0 )
            {
               *child = startnode->children[i];
                 s = 1 ;
                 break;
            }
     
          if ( (s = FindNode(startnode->children[i],nodename, child)) != 0 )
             break ;
     
          i++;
       }
     
      return s ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut merci mais
    ....
    merci pour cette réponse mais sauf erreur de ma part la fonction ne passe pas l'élément child

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    ??

    ben si elle le passe....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int FindNode(struct basicxmlnode *startnode,char *nodename, struct basicxmlnode **child)
    ...
              *child = startnode->children[i];
     ...
          if ( (s = FindNode(startnode->children[i],nodename, child)) != 0 )
    ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par pierremx Voir le message
    ....
    merci pour cette réponse mais sauf erreur de ma part la fonction ne passe pas l'élément child
    Dans la version de souviron34 si car pour sortir d'une fonction sans qu'elle remonte tous les appels précédents, il faut en faire une fonction récursive terminale. Plus d'infos sur la récursivité ici : http://franckh.developpez.com/tutori...i/recursivite/
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut oui erreur de ma part
    Désolé il était tard... un tout grand merci pour ces informations très utiles et intéressantes

    Avant de faire fonctionner la solution de souviron34, j'en ai fait une, fonctionnelle, à base de "return en cascade" pour me renvoyer l'adresse recherchée.
    Je la remets au propre et je la poste ici rapidement pour avoir votre avis.

    Bon début de week end à tous!
    Pierre.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut ma solution de dépannage
    Voici ce que j'avais pondu pour m'en sortir.
    Comparé à la solution suggérée précédemment, c'est moins élégant.

    Bonne soirée!
    Pierre.

    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
    struct basicxmlnode * FindNode(struct basicxmlnode *startnode,char *nodename)
    {
    	int i=0;struct basicxmlnode *nodetemp=NULL;
     
    	while(startnode->children[i]){
    		if(!strcmp((startnode->children[i]->tag),nodename)){
    			return startnode->children[i];
    			break;
    		}
    		if (nodetemp==NULL){
    		nodetemp=FindNode(startnode->children[i],nodename);
    		}
    		if (!strcmp((nodetemp->tag),nodename)) return nodetemp;
    		i++;
    	}
    }

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    2 remarques pour avoir du bon code :

    strcmp N'EST PAS UN BOOLEEN

    qu'est-ce qui te fatigue à écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( strcmp(s1,s2) == 0 )
    ??

    Même remarque pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	while(startnode->children[i]){
    qu'est-ce qui te fatigue à écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	while(startnode->children[i] != NULL){
    ??


    c'est un pointeur, il a normalement le type pointeur, donc même si il peut s'avérer exact que NULL = 0 dans un test, ce n'est pas la même chose...

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut bonnes remarques...
    Merci pour ces remarques (justes) !

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    n'oublie pas le flag
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. fonction récursive: erreur
    Par calla29 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/05/2006, 11h51
  2. [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
  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