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
    Nouveau membre du Club
    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
    Points : 38
    Points
    38
    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
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    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
    Nouveau membre du Club
    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
    Points : 38
    Points
    38
    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 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    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
    Nouveau membre du Club
    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
    Points : 38
    Points
    38
    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, 11h05
  2. Crash avec boost::function
    Par Bakura dans le forum Boost
    Réponses: 15
    Dernier message: 22/12/2007, 17h26
  3. Crash avec wxTextCtrl::GetSelection()
    Par Mersenne dans le forum wxWidgets
    Réponses: 3
    Dernier message: 08/06/2007, 21h23
  4. Crash avec GenericDirCtrl
    Par tool69 dans le forum wxPython
    Réponses: 3
    Dernier message: 20/11/2006, 20h56
  5. [Installation] Crash avec la commande cvs init
    Par Pseudo01 dans le forum CVS
    Réponses: 1
    Dernier message: 19/11/2006, 10h35

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