Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récursivité qui fait tout planter

et sans ça marche :-(

Sujet résolu
    23 juin 2008 à 14:24:39

    Bonjour !
    J'ai une fonction qui a pour but de "scanner" un dossier et écrire le chemin des fichiers trouvés dans un fichier.
    La fonction est récursive :
    si l'élément trouvé est un dossier, on relance la fonction pour scanner ce nouveau dossier.
    La fonction récursive marche quand le dossier est . ou ../dossier mais seulement dans ces cas-là :(
    Sinon quand j'enlève la récursivité, ça marche avec tous les dossiers, mais la fonction perd (à peu près) tout son intérêt !
    Comment résoudre ce problème ?
    void scanner(char *dossierAscanner, long *nbFichiers, long *nbDossiers)
    {
    	char sortieFichier[1000000];
    	viderChaine(sortieFichier);
    	
    	struct dirent *lecture;
    	DIR *rep;
    	rep = opendir(dossierAscanner);
    	while((lecture = readdir(rep)))
    	{
    		struct stat *fichier = new struct stat;
    		
    		char fichierCourantChar[6000];
    		if(strcmp(dossierAscanner, ".") == 0 || strcmp(dossierAscanner, "./") == 0)// si le dossier à scanner est "."
    			sprintf(fichierCourantChar, "%s", lecture->d_name);
    		else
    			sprintf(fichierCourantChar, "%s/%s", dossierAscanner, lecture->d_name);
    		
    		stat(fichierCourantChar, fichier);
    		
    		if(strcmp(lecture->d_name, ".") != 0 && strcmp(lecture->d_name, "..") != 0)
    		{
    			if(S_ISDIR(fichier->st_mode) == 1)// si c'est un dossier
    			{
    				char temp1[5000];
    				sprintf(temp1, "%s/\n", fichierCourantChar);
    				strcat(sortieFichier, temp1);
    				*nbDossiers += 1;
    				long nbDossiersTemp = 0;
    				long nbFichiersTemp = 0;
    				scanner(fichierCourantChar, &nbFichiersTemp, &nbDossiersTemp);
    				*nbDossiers += nbDossiersTemp;
    				*nbFichiers += nbFichiersTemp;
    			}
    			else// si c'est un fichier
    			{
    				char temp2[5000];
    				sprintf(temp2, "%s\n", fichierCourantChar);
    				strcat(sortieFichier, temp2);
    				*nbFichiers += 1;
    			}
    		}
    		delete fichier;
    	}
    	closedir(rep);
    	
    	// on ecrit dans le fichier
    	FILE* fichierOut = NULL;
    	fichierOut = fopen("liste", "a");
    	
    	if(fichierOut != NULL)
    	{
    		fprintf(fichierOut, "%s", sortieFichier);
    		fclose(fichierOut);
    	}
    }
    
    void viderChaine(char *chaine)
    {
    	size_t i = 0;
    	while(i < strlen(chaine))
    	{
    		chaine[i] = '\0';
    		i++;
    	}
    }
    

    Edit: code compilable par tout le monde ;)
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2008 à 14:31:38

      "char sortieFichier[1000000];"

      OMG ! ... Je m'excuse mais c'est la première chose qui m'a frappé !

      1000000 * sizeof( char ) = 1000000 Octets.
      1000000 ~= 976 Ko

      Considérant que tu as environ 1 Mo de mémoire automatique d'alloué à ton programme, la fonction ne peut être appelé qu'une fois...

      >> std::string serait déjà une grande amélioration ! Faut apprendre le C++ sur le forum C++. Si tu ne veux pas je te dirige vers le forum C.


      Re-edit : En passant, en Windows les chemin d'accès sont d'un maximum de 256 caractères ASCII. Il faudrait confirmer pour Linux mais ça te permetterais de réduire tout tes énormes tableaux... Encore une fois >> std::string serait mieux.
      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2008 à 14:40:22

        Au départ j'ai écrit la fonction en C :-° !
        d'ailleurs son homologue en C marche :ninja: ... mais je suis obligé de compiler en C++ et donc (par exemple) de mettre des new et des delete (peut-être ça qui fait planter :euh: )
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 juin 2008 à 14:41:28

          Euh ce code est du C.
          Soit tu passe à une méthode C++ (boost::filesystem) soit tu post dans le forum à coté.
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2008 à 14:43:10

            Alors déclare au compilateurs qu'il doit la compiler en C :

            extern "C" void mafonction()
            {
            //...
            }

            Tu devras retirer toutes les fonctionnalités du C++... i.e. new.
            • Partager sur Facebook
            • Partager sur Twitter
              23 juin 2008 à 14:54:23

              Citation : MatteX

              Alors déclare au compilateurs qu'il doit la compiler en C :

              extern "C" void mafonction()
              {
              //...
              }

              Tu devras retirer toutes les fonctionnalités du C++... i.e. new.


              Oui j'ai essayé mais avec un projet C ça marche mais même en compilant "comme du C" j'ai encore cette erreur :colere:
              • Partager sur Facebook
              • Partager sur Twitter
                23 juin 2008 à 15:23:59

                Ta structure elle est C ou C++ ? Si elle est C entoure là d'un bloc extern "C". ET reviens au malloc...
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juin 2008 à 15:28:03

                  LA structure est en C (c'est pas la mienne ^^ )
                  J'ai essayé de mettre en extern "C" mais il faut que je mette
                  struct stat *fichier = new struct stat;
                  
                  pour que ça marche...
                  Et puis au lieu d'écrire dans le fichier j'utilise un
                  freopen("liste", "a", stdout);
                  

                  Mais je n'arrive pas à vider le fichier après l'avoir utilisé pour recommencer... (un 4 ème problème :( )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juin 2008 à 15:35:23

                    S'il y a un truc qui fait planter, c'est ça dans du récursif "char sortieFichier[1000000];".
                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                      23 juin 2008 à 15:46:21

                      Citation : lmghs

                      S'il y a un truc qui fait planter, c'est ça dans du récursif "char sortieFichier[1000000];".

                      Même en mettant plus petit c'est pareil

                      Edit:


                      C'est bon j'ai trouvé comment faire (c'était tout con en plus :euh: ) ! merci de votre aide ! :ange:
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Récursivité qui fait tout planter

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown