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 :

recursivité....


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut recursivité....
    salut a toutes (?) et tous, j'ai ecrit une tite fonction de listage de fichier recursive que voici :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    bool CPictureManager::picFinder(TCHAR * path)
    {
     
    	TCHAR tempPath [MAX_PATH];
    	TCHAR tmp [MAX_PATH];
     
    	lstrcpy(tempPath,path);
    	lstrcpy(tmp,path);
     
    	lstrcat(tempPath,this->m_searchedFiles);
     
    	#ifdef DEBUG
    	UNICODE_debugTrace(TEXT("CPictureManager::picFinder => Start searching in %s"),tempPath);
    	#endif
     
    	WIN32_FIND_DATA FileData = {0}; 
    	HANDLE hFile = NULL; 
     
    	hFile = FindFirstFile(tempPath, &FileData);
     
     
    	if (hFile != INVALID_HANDLE_VALUE) 
    	{
    		do
    		{
    			if((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
    			{
    				#ifdef DEBUG
    				UNICODE_debugTrace(TEXT("CPictureManager::picFinder => folder found : %s"),FileData.cFileName);
    				#endif
    				this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    			}
     
    			else if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
    			{
    				#ifdef DEBUG
    				UNICODE_debugTrace(TEXT("CPictureManager::picFinder => file found : %s"),FileData.cFileName);
    				#endif
    			}
    		}while (FindNextFile(hFile, &FileData) != 0);
    	}
     
    	#ifdef DEBUG
    	UNICODE_debugTrace(TEXT("CPictureManager::picFinder => End of search in %s"),tempPath);
    	#endif
     
    	return true;
    }
    et la trace donne ça
    12:49:53(9274390680),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \*.*

    12:49:53(9274395945),thr 0x02D334DA : CPictureManager::picFinder => file found : ftlcpc007.jpg

    12:49:53(9274400150),thr 0x02D334DA : CPictureManager::picFinder => folder found : profiles

    12:49:53(9274403812),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \profiles\*.*

    12:49:53(9274408783),thr 0x02D334DA : CPictureManager::picFinder => folder found : default

    12:49:53(9274411938),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \profiles\default\*.*

    12:49:53(9274418123),thr 0x02D334DA : CPictureManager::picFinder => file found : ftlcpc007.jpg

    12:49:53(9274423101),thr 0x02D334DA : CPictureManager::picFinder => End of search in \profiles\default\*.*

    12:49:53(9274427250),thr 0x02D334DA : CPictureManager::picFinder => End of search in \profiles\*.*

    12:49:53(9274431179),thr 0x02D334DA : CPictureManager::picFinder => folder found : Storage

    12:49:53(9274435165),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \profiles\Storage\*.*

    12:49:53(9274439387),thr 0x02D334DA : CPictureManager::picFinder => End of search in \profiles\Storage\*.*

    12:49:53(9274444863),thr 0x02D334DA : CPictureManager::picFinder => folder found : Temp

    12:49:53(9274448513),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \profiles\Storage\Temp\*.*

    12:49:53(9274452770),thr 0x02D334DA : CPictureManager::picFinder => End of search in \profiles\Storage\Temp\*.*

    12:49:53(9274457384),thr 0x02D334DA : CPictureManager::picFinder => folder found : Windows

    12:49:53(9274461448),thr 0x02D334DA : CPictureManager::picFinder => Start searching in \profiles\Storage\Temp\Windows\*.*

    12:49:53(9274465693),thr 0x02D334DA : CPictureManager::picFinder => End of search in \profiles\Storage\Temp\Windows\*.*

    12:49:53(9274470171),thr 0x02D334DA : CPictureManager::picFinder => End of search in \*.*
    et je comprends pô pourquoi il colle les dossiers les un aux autres quand il sort des sous dossiers
    End of search in \profiles\*.*
    CPictureManager::picFinder => folder found : Storage
    CPictureManager::picFinder => Start searching in \profiles\Storage\*.*
    alors que l'arbo est :
    \Profiles
    \Storage
    Quelqu'un voit une grosse bourde que j'ai pas vue depuis une heure que je #¨$+}°@

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut lstrcpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //strcat fonction retourne ET transforme tmp :@
    this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    et m... il y a une fonction qui laisses les sources tranquille pour fair un concat ou pas ?? un truc style concat ??

    qui fasse :

    str1 = "A"
    str2"B"

    str1+str2= "AB" et que l'on ai tjrs str1="A" et str2="B"....

  3. #3
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Ton probleme se passe quand il y a plusieurs sous dossier (niveau 1) dans un dossier (niveau 0): à ce moment, tu rappelles successivement ta fonction de maniere iteratif (c normal puisque les sous dossier sont au meme niveau). sauf que dans ce ca precis, entre 2 appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    tu ne re initialise pas ton chemin

    Si pas assez claire... re demande

  4. #4
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Bah suffit de faire deux strcat sur un buffer temporaire remis à zero a chaque appel de la fonction non

    EDIT: c incroyable ça, le temps de lire ton code de trouver l'erreur et c deja trop tard.... on peut meme plus aider maintenant

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut humm po compris....
    Citation Envoyé par harsh
    Ton probleme se passe quand il y a plusieurs sous dossier (niveau 1) dans un dossier (niveau 0): à ce moment, tu rappelles successivement ta fonction de maniere iteratif (c normal puisque les sous dossier sont au meme niveau). sauf que dans ce ca precis, entre 2 appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    tu ne re initialise pas ton chemin

    Si pas assez claire... re demande
    Je suis pas sur en fait j'ai pas besoin de réinitilier le chemin meme sue un meme nivo si le truc trouve un dossier il se reappael avec l'endroit d'ou il vien et le nom du dossier trouvé ! Meme a nivo identique ça doit marcher !
    (d'ailleur ça marche si tu regarde bien le log

    Citation Envoyé par harsh
    Bah suffit de faire deux strcat sur un buffer temporaire remis à zero a chaque appel de la fonction non

    EDIT: c incroyable ça, le temps de lire ton code de trouver l'erreur et c deja trop tard.... on peut meme plus aider maintenant
    je vais esssayer ça tien masi ya pas plus "propre"

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut heu j'ai un doute en fait
    je peux pas mettre ça dans une autre buffer remi a zero sinon je perds l'arbo !!!
    Le truc c'est qu'il faudrait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    passe il faut pas que tmp soit changé ! si je passe par une uatre buffer je oerds la recursivité c'est seulement que tmp doit pas bouger !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut paye ton boulet...
    alors la vraiment je suis tres tres pas malin pardon harsh
    En fait tu avit raison (a moitié ), pour eviter le probleme il suffit de faire un buffer temporaire (un seul suffit en fait) ça donne ça :
    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
     
    hFile = FindFirstFile(tempPath, &FileData);
     
    	if (hFile != INVALID_HANDLE_VALUE) 
    	{
    		do
    		{
    			TCHAR tempBuff [MAX_PATH] = {0};<<<<======= merci hash ;)
    			lstrcpy(tempBuff,tmp);
    			if((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
    			{
    				DEBUGMSG (ZONE_INFO, (TEXT("CPictureManager::picFinder => folder found : %s\r\n"),FileData.cFileName));
    				_LOG(TEXT("CPictureManager::picFinder => folder found : %s"),FileData.cFileName);
     
    								this->picFinder(lstrcat(tempBuff,lstrcat(FileData.cFileName,TEXT("\\"))));
     
    			}
     
    			else if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
    			{
    				DEBUGMSG (ZONE_INFO, (TEXT("CPictureManager::picFinder => file found : %s\r\n"),FileData.cFileName));
    				_LOG(TEXT("CPictureManager::picFinder => file found : %s"),FileData.cFileName);
     
    			}
    		}while (FindNextFile(hFile, &FileData) != 0);
    	}

  8. #8
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    En fait meme pas mal, faut pas confondre recursivite et multi thread
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->picFinder(lstrcat(tmp,lstrcat(FileData.cFileName,TEXT("\\"))));
    si tu remet tmp à la valeur de ta racine courante, tu perds pas ta recursivité ?! Puisque les fonctions ainsi appelé utiliserons le bon tmp et ce n'est qu'a la igne suivante que tu la changes...


    EDIT : c une manie chez toi de trouver les reponses pendant que les autres y reflechisse

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut decidement on se croise
    Et oh ça ca va c'est vendrdi il est tard alors un !!
    merci

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 293
    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 293
    Par défaut Re: humm po compris....
    Citation Envoyé par chronos
    je vais esssayer ça tien masi ya pas plus "propre"
    Le faire en C++ ?
    (Parce que tous ces strcat et autres strcpy qui peuvent déborder, miam les failles sécuritaires)
    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...

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut Re: humm po compris....
    Citation Envoyé par Luc Hermitte
    Citation Envoyé par chronos
    je vais esssayer ça tien masi ya pas plus "propre"
    Le faire en C++ ?
    (Parce que tous ces strcat et autres strcpy qui peuvent déborder, miam les failles sécuritaires)


    http://c.developpez.com/faq/cpp/?page=strings

  12. #12
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    C'est vrai...

    Dur de perdre ses habitudes quand on vient du C....

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut pas de probleme mais
    pas de probleme pour moi mais en passant les "paths" en std::string j'ai de leger probleme...
    Tout est en unicode chez moi (je suis sur un telephone portable) alors si tu fait

    std::string str = TEXT("kikou");

    le compilo ets pas bien content, tout est en unsigned char(*) alors je veux bien faire du C++ mais la....

  14. #14
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ca n'a pas de sens ce que tu écris. TEXT sert à transformer les chaine en UNICODE, mais std::string c'est ansi. Voilà ce que je fais personnelement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef UNICODE
    typedef std::wstring String;
    #else
    typedef std::string String;
    #endif
     
    String str = TEXT( "kikou" );
    Et là ça marche 8)

    edit: en fait je percute maintenant seulement : on pourrait simplement faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef std::basic_string<TCHAR> String;
     
    String str = TEXT( "kikou" );

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut veouinnn
    J'ai bien essayer ton truc mais voilà...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef std::basic_string<TCHAR> String;
    String str = TEXT("allo");
    _LOG(TEXT("CPictureManager::CPictureManager => normally %s"),str);
    et la trace...
    CPictureManager::CPictureManager => normally ??
    En gros la chaine n'est pas en unicode dans String

    Une autre question comment utilisé std::list !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private:
    std::list<String> fileList;
    .....
    String str = TEXT("allo");
    this->fileList.push_front(str);
    _LOG(TEXT("CPictureManager::CPictureManager => listSize = %d"),this->fileList.size());
    	_LOG(TEXT("CPictureManager::CPictureManager => normally %s"),str);
    	_LOG(TEXT("CPictureManager::CPictureManager => front %s"),this->fileList.front());
    	_LOG(TEXT("CPictureManager::CPictureManager => back %s"),this->fileList.back());
    ça me sort la trace suivante
    _14:21:59(5982897218),thr 0x42AA66B2 : CPictureManager::CPictureManager => listSize = 1
    14:21:59(5982900485),thr 0x42AA66B2 : CPictureManager::CPictureManager => normally ??
    14:21:59(5982910093),thr 0x42AA66B2 : CPictureManager::CPictureManager => front (null)
    14:21:59(5982932838),thr 0x42AA66B2 : CPictureManager::CPictureManager => back (null)
    ya rien dans ma liste en fait ?? ou il fait encore cater la sortie ?? quand meme pas

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Un string ne s'affiche pas telle quelle comme un char* avec un %s. Il faut utiliser str.c_str() pour récupérer le contenu de ta chaîne sous forme de const char*, et donc être compatible avec %s.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut Vi
    Effectivement toutes mes excuse j'ai pas bien lu les prototypes de mes fonctions , en plus j'en ai profité pour passer en c++ "pour du vrai".
    std;;wstring ça a plus de gueule que TCHAR* quand meme, merci pour les reponses

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

Discussions similaires

  1. Iteration VS recursivité
    Par yacinechaouche dans le forum C
    Réponses: 40
    Dernier message: 16/11/2012, 11h52
  2. [Recursivite] function/procedure d'une suite logique
    Par Tata dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 02/03/2005, 16h13
  3. Probleme de recursivite (lie au TSP) :(
    Par piff62 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 05/02/2005, 11h30
  4. [CR10] Recursivite
    Par loumanga dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 04/10/2004, 11h14
  5. [FLASH MX 2004]-probleme de recursivité.
    Par calfater dans le forum Flash
    Réponses: 3
    Dernier message: 10/05/2004, 19h48

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