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 :

Récupération et restitution d'une arborescence


Sujet :

C++

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Par défaut Récupération et restitution d'une arborescence
    onjour à tous

    Alors voilà j'essaye de réaliser une fonction de Browse, c'est à dire parcourir une arborescence contenant des dossiers, des sous-dossiers, des sous sous dossiers [...] et des variables. Sachant qu'on ne sait pas comment est constituer l'arborescence évidemment

    Voici un exemple :

    Root--- Objects

    --- Types

    --- Functions --- Add

    --- Delete

    --- Clean

    --- Select --- 1 --- Y

    --- 2 --- Y

    ...

    --- 10 --- Y


    Et j'ai à ma disposition une fonction partialBrowse(node) qui en fait va me permettre de connaître les sous dossiers du node qu'on lui donne, par exemple : partialBrowse(Root) va me permettre de récupérer le nom et l'adresse d' Objects, de Types et de Functions, ainsi que le nombre de sous dossiers 3.

    En me basant sur le principe de récursivité, voici ce que j'ai développé :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    BrowseInternal (NodeId node){ 
           int32_t currentNoOfBranches;
        NodeId* currentNodeId;
        value_ready = false;
     
            partialBrowse(node)
        printf(">>Browse : Sending Browse request ....\n");
     
     
    // Attente de la réponse
        loopCpt = 0;
        while (value_ready == false && loopCpt * sleepTimeout <= loopTimeout)
        {
            loopCpt++;
            SOPC_Sleep(100);
        }
     
        currentNodeId = nextNodeId;
        currentNoOfBranches = noOfBranches;
     
        if (currentNoOfBranches == 0) {
            return 0;
        }
        else {
            for (int i = 0; i < currentNoOfBranches; i++) {
                value_ready = false;
                int ok = BrowseInternal(currentNodeId[i]);
            }
     
        } 
    }
    Voilà et donc en fait j'envoie cette requête partialBrowse et je reçois une réponse que je traite comme ceci :

    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
    void Test_ComEvent_FctClt(SOPC_App_Com_Event event, void * param)
    {
         printf(">>Browse AddressSpace: Received browse response \n");          
         BrowseResponse* pBrowseResp = (BrowseResponse*)param;
        if (NULL == pBrowseResp)
        {
        printf(">>Browse: Invalid browse response \n");
        }
     
        if (value_ready == false)
        {
            BrowseResult browseRslt = pBrowseResp->Results;
            noOfBranches = browseRslt.NoOfReferences;    //récupération du nbre de fils
     
            for (int j = 0; j < noOfBranches; j++) {
                nextNodeId[j] = browseRslt.NodeId[j];  //récupération du noms des fils
            }
     
             }
     
         value_ready = true;
    }
    Et ce que ce que j'arrive à récupérer un chemin jusqu'à une feuille de mon arbre donc par exemple, je récupère correctement les noms Objects, Type et Functions, le partialBrowse s'effectue sur Functions je récupère donc Add, Delete, Clean, Select, le partialBrowse s'effecture sur Select, je récupère les 10 numéros ainsi que leur 10 Y, mais je ne remonte pas + les niveaux après, et ça effectue même deux fois la séquence partialBrowse (1) puis partialBrowse(2), donc je ne comprends pas tout...
    Je dirais que c'est une question de contexte et de pile d’exécution, mais pour moi en copiant le noOfBranches et le nextNodeId dans des variables locales de ma fonction BrowseInternal, ça devrait être suffisant non ?
    Bon donc si quelqu'un a une petite astuce pour mon problème je prends

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    C'est du C et pas du C++.
    Vous faites un algo récursif mais il y a des variables, vraisemblablement globales qui sortent du chapeau, comme la variable "nextNodeId".
    Si vous voulez faire correctement de la récursivité, il faut que votre fonction n'utilise aucun effet de bord donc pas de variables globales et "béret rouge des para".

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Par défaut
    Merci pour votre réponse, et en fait si le code est bien du C++, je l'ai juste simplifié pour ma question ici..

    Et en effet la variable comme nextNodeId ou nextNoOfBranches sont des variables globales, car je leur assigne les valeurs correspondantes récupérées dans la réponse. Sinon je ne vois pas comment je peux rester en local et récupérer ses valeurs.

    Et donc je pensais peut être un peu naïvement quand déclarant deux variables locales et que leur assigner les valeurs de nextNodeId et nextNoOfBranches ça palier cette erreur

    "béret rouge des para", désolée je vois pas le rapport

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Merci pour votre réponse, et en fait si le code est bien du C++, je l'ai juste simplifié pour ma question ici..
    Si ce vieux machin en C est une simplification d'un code C++, c'est que vous avez énormément de lacune en C++ "moderne".

    Et en effet la variable comme nextNodeId ou nextNoOfBranches sont des variables globales,
    Récursivité + variables globales = bugs automatiques.
    Déjà que "variables globales" c'est quasiment toujours bugs automatiques.

    Sinon je ne vois pas comment je peux rester en local et récupérer ses valeurs.
    Les paramètres des fonctions, ça sert à quoi d'après vous ?

    "béret rouge des para", désolée je vois pas le rapport
    Rapport au PARAchutage de variable.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Par défaut
    Ok j'envoie une requête de Browse et dans une autre fonction je traite la réponse reçue qui contient les variables dont j'ai besoin, comment puis-je passer ces variables là dans ma fonction récursive où je réalise les requêtes ?
    Je n'appelle pas ma fonction directement, je ne peux donc pas lui passer les paramètres que je veux non ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Votre code est horrible, aucune conception POO digne de ce nom ne serait aussi alambiquée.
    Le caractère asynchrone du machin ne simplifie pas les choses.
    Je suis à peu près sûr que les API utilisées, même C, dispose de possibilité de passer un contexte, même via un pointeur.

    à la rigueur, on va essayer de palier rapidement à cette horreur.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    BrowseInternal(NodeId node)
    {
    	int32_t currentNoOfBranches;
    	std::vector<NodeId> currentNodeId;
    	value_ready = false;
     
    	partialBrowse(node)
    		printf(">>Browse : Sending Browse request ....\n");
     
     
    	// Attente de la réponse
    	loopCpt = 0;
    	while (value_ready == false && loopCpt * sleepTimeout <= loopTimeout)
    	{
    		loopCpt++;
    		SOPC_Sleep(100);
    	}
     
    	currentNoOfBranches = noOfBranches;
    	for (int i = 0; i < noOfBranches; i++)
    	{
    		currentNodeId.push_back(nextNodeId[i]);
    	}
     
    	if (currentNoOfBranches == 0) {
    		return 0;
    	}
    	else {
    		for (int i = 0; i < currentNoOfBranches; i++) {
    			value_ready = false;
    			int ok = BrowseInternal(currentNodeId[i]);
    		}
     
    	}
    }
    Je vous laisse gérer vos variables globales sous forme de tableau à taille variable et vos boucles actives où les cas de timeOut ne sont pas correctement gérer.

Discussions similaires

  1. Registre : récupération d'une arborescence
    Par AndréPe dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/11/2008, 09h24
  2. Récupération de fichiers dans une arborescence
    Par bibilolo2 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 04/05/2007, 22h19
  3. Remonter une arborescence
    Par Gwipi dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/11/2003, 18h04
  4. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

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