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 :

Crash avec readdir


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Architecte syst�mes
    Inscrit en
    Mai 2017
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2017
    Messages : 32
    Par d�faut Crash avec readdir
    Bonjour � tous,

    Je suis en train de coder un programme pour lire les .txt d'un dossier. Ces textes ont la forme suivante : "nom_compteur.txt". Le programme renvoie alors les adresses des textes dont les noms font parties d'une liste et dont les compteurs sont les plus �lev�s.

    Mais le programme crash au niveau de readdir (par moment) et � la fin avant de retourner les adresses. Est-ce que vous auriez une id�e de comment �viter ces probl�mes? Je ne maitrise pas forcement toutes les subtilit�s pour les allocations m�moires

    J'utilise Microsoft Visual Studio pour compiler et je suis sous Win32 ; les headers appel�s sont les suivants :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <stdlib.h>
    #include <chrono>
    #include <vector>
    #include "dirent.h"
    #include <windows.h>
    #include <sstream>
    #include <iterator>
    #include <iostream>
    #ifndef WIN32
    #include <sys/types.h>
    #endif
    La structure du repertoire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    typedef struct repertoire {
    	std::vector<std::string> adresse;
    	std::vector<int> compteur;
    };
    Voici le code :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    void lecture_repertoire(std::vector <string> list, std::string adresse, repertoire *repertoire) {
     
    	std::vector<std::string> files;
    	struct dirent* entry;
     
    	DIR* dir = NULL;
     
            // Ouverture du dossier à l'adresse spécifiée
     
    	dir = opendir(adresse.c_str());
     
    	if (dir == NULL)
    	{
                    // Si le dossier n'existe pas, alors le programme renvoie "j" adresses construites avec le vecteur "list"
     
    		for (int j = 0; j < list.size(); j++) {
    			std::string file_name(adresse + list[j] + "_1" + ".txt");
    			repertoire->adresse[j] = file_name;
    		}
    	}
    	else {
    		// Si le dossier existe alors le programme construit un vecteur d'adresses "files" lues dans le dossier
     
    		while ((entry = readdir(dir)) != NULL)
    		{
    			if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0 && strcmp(entry->d_name, "Old") != 0) { files.push_back(entry->d_name); }
     
    			// Crash par moment ici
    		}
     
    		closedir(dir);
     
    		// Le programme construit ensuite "j" adresses dans répertoire avec le vecteur d'adresse et la list ; il veille à ce que les adresses soient la dernière version (à partir du compteur)
     
    		for (int j = 0; j < list.size(); j++) {
     
    			repertoire->compteur[j] = 1;
    			std::string tmp;
     
    			for (int i = 0;i < files.size();i++) {
     
    				std::string name1;
    				std::string name2;
    				std::size_t ext_pos;
    				int str2;
     
    				name1 = files[i];
    				name2 = files[i];
     
                                    // name1 et name2 sont les adresses de files et sont découpées pour isoler le compteur/version du fichier et le nom
     
    				ext_pos = name1.find_last_of('_');
    				name1 = files[i].substr(0, ext_pos);
    				name2 = files[i].substr(ext_pos + 1);
     
    				ext_pos = name1.find_last_of('/');
    				name1 = name1.substr(ext_pos + 1);
    				ext_pos = name2.find_last_of('.');
    				name2 = name2.substr(0, ext_pos);
     
    				sscanf_s(name2.c_str(), "%i", &str2);
     
    				if (name1 == list[j] && str2 > repertoire->compteur[j]) repertoire->compteur[j] = str2; // On note la dernière version/compteur du fichier
    			}
     
    			tmp = std::to_string(repertoire->compteur[j]);
     
    			std::string temp = list[j];
     
    			std::string file_name(adresse + temp + "_" + tmp + ".txt");
     
    			// Crash ici 
     
    			repertoire->adresse[j] = file_name;
     
    			// On construit "j" adresses dans répertoire à la dernière version
    		}
    	}
    	files.clear();
    }
    Toute aide est la bienvenue parce que l� je s�che

    Mango1

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 131
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    Par d�faut
    Bonjour,

    Je dois dire, les ent�tes ne nous servent pas � grand chose.
    Ensuite, je suis surpris qu'en utilisant Visual Studio, vous n'avez pas eu l'honneur d'�tre introduit au d�bogueur (votre prochain second meilleur ami). N'h�sitez surtout pas � l'utiliser (voir cette introduction � la pratique).

    Une piste serait que le pointeur repertoire ne soit pas valide. Du coup, �a serait la faute de l'appelant. Aussi, vous devriez passer une r�f�rence, au lieu d'un pointeur (afin d'enlever des risques de pointeur invalide).
    Vous souhaitez participer � la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui conna�t l'erreur, conna�t la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Architecte syst�mes
    Inscrit en
    Mai 2017
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2017
    Messages : 32
    Par d�faut
    Bonjour,

    Merci pour ta r�ponse et la piste

    J'ai modifi� la structure r�pertoire et l'ai initialis�e avec des calloc :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    typedef struct repertoire {
    	std::string* adresse;
    	int *compteur;
    };
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    	repertoire.adresse = (string*)calloc((13), sizeof(string));
    	repertoire.compteur = (int*)calloc((13), sizeof(int));
    et �a marche!

    Pour le d�bugueur, je ne peux pas l'utiliser car je compile un DLL mais c'est vrai que c'est handicapant

    merci en tout cas pour tes conseils

  4. #4
    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
    Donc tu utilises calloc dans un code suppos�ment en C++ pour initialiser des std::vector devenus simples pointeurs parce que....
    D�sol� mais y'a rien qui va dans cette phrase.
    Et oui tu peux tr�s bien debugger des dll. Quand le programme qui l'ex�cute crash, il propose tout autant la callstack et tu peux charger tes pdb et rechercher tes fichiers sources pour voir le probl�me.
    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.

  5. #5
    Membre averti
    Homme Profil pro
    Architecte syst�mes
    Inscrit en
    Mai 2017
    Messages
    32
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2017
    Messages : 32
    Par d�faut
    J'ai modifi� la structure de repertoire en virant le std::vector et en utilisant des calloc � la place

    Et oui tu peux tr�s bien debugger des dll. Quand le programme qui l'ex�cute crash, il propose tout autant la callstack et tu peux charger tes pdb et rechercher tes fichiers sources pour voir le probl�me.
    Tu viens de m'apprendre quelque chose

    Par contre quand le programme crash, il affiche rien chez moi ; comment j'acc�de � la callstack?

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

Discussions similaires

  1. Probl�me avec readdir ?
    Par chakan dans le forum Langage
    R�ponses: 6
    Dernier message: 05/05/2008, 10h05
  2. Crash avec boost::function
    Par Bakura dans le forum Boost
    R�ponses: 15
    Dernier message: 22/12/2007, 16h26
  3. Crash avec wxTextCtrl::GetSelection()
    Par Mersenne dans le forum wxWidgets
    R�ponses: 3
    Dernier message: 08/06/2007, 20h23
  4. Crash avec GenericDirCtrl
    Par tool69 dans le forum wxPython
    R�ponses: 3
    Dernier message: 20/11/2006, 19h56
  5. [Installation] Crash avec la commande cvs init
    Par Pseudo01 dans le forum CVS
    R�ponses: 1
    Dernier message: 19/11/2006, 09h35

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