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 :

Erreur sur push_back.


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut Erreur sur push_back.
    Bonjour @tous,

    Je développe une application console qui liste un type de fichier en fonction d'un répertoire d'entrée.

    Rien de très compliqué vous l'aurez compris.

    J'ai mon code source qui fonctionne très bien en mode DEBUG sous visual, qui fonctionne également lorsque que l'on double-clique directement sur l'EXE.

    Ce meme code source fonctionne très bien en mode RELEASE sous visual, MAIS il ne fonctionne pas lorsque je double-clique sur l'EXE directement.

    L'erreur que j'ai identifié vient d'un appel a un push_back sur un vector.
    L'erreur est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur d'application : L'instruction à "0x7c..." emploie l'adresse mémoire "0x000000000". la mémoire ne peut pas etre "read" ...
    Bref une erreur de pointeur en général ...
    Mais là je ne comprend pas pourquoi ça fonctionne sous visual et pas directement avec l'EXE.

    Est ce que quelqu'un pourrait m"éclairer ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    peut être un problème d'environnement d'exécution.
    tu exploites la liste de commande du programme ?

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    La liste de commande du programme ?

    Tu veux parler des paramètres de commande au lancement de l'appli ?
    Dans ce cas non, je ne les utilise pas.

    J'ai un fichier ini pour la configuration de mon dossier d'entrée.

    J'ai regardé de ce coté dans tous les modes, ce fichiers est bien lu, et les infos sont bien récoltées.

    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
    /**
    * \brief Fonction qui liste les répertoire dans un dossier
    * \param strFolder dossier a vérifier
    * \return tableau contenant la liste des répertoires
    */
    vector<string> ListingFolder(const string& strFolder)
    {
    	WIN32_FIND_DATA File; // Va contenir les informations de la recherche
    	HANDLE liste = NULL; 
    	vector<string> vReturn = static_cast< vector<string> >(NULL);
    	vReturn.clear();
    
    	int iSize = static_cast<int>(strFolder.size());
    	char* strTmp = new char[iSize+1];
    
    	strncpy(strTmp, strFolder.c_str(), iSize);
    	
    	if ( strTmp[strlen(strTmp)-1] != '\\')
    		sprintf(strTmp, "%s\\*.*", strFolder.c_str());	
    	else
    		sprintf(strTmp, "%s*.*", strFolder.c_str());
    	
    	//On cherche le premier Fichier
    	liste = FindFirstFile( strTmp, &File ); 
    	if ( liste == INVALID_HANDLE_VALUE ) 
    		return static_cast< vector<string> >(NULL); 
    	else 
    	{
    		if (File.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
    		{
    			string strFileName = "\\"; 
    			strFileName.append(File.cFileName);
    			vReturn.push_back(strFolder+strFileName);
    		}
    	}	
    	
    	//Tant qu'il existe un fichier suivant
    	while ( FindNextFile( liste, &File ) ) 
    	{ 
    		//Si ce fichier est un répertoire
    		if ( File.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) 
    		{
    			//On ajoute le fichier, à la liste
    			printf("avant push\n");
    			string strFileName = "\\"; 
    			strFileName.append(File.cFileName);
    			vReturn.push_back(strFolder+strFileName);
    			printf("après push\n");
    		} 
    	} 
    	
    	//On arrete la recherche.
    	FindClose( liste ); 
    	return vReturn;
    }
    Le problème se situe à ce niveau là : entre les printf.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et si la lecture du fichier .ini échoue par exemple ?
    de toute façon pointe toutes allocations mémoires,
    ton plantage correspond à l'utilisation d'un pointeur nul.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Je pense que l'erreur vient de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string> vReturn = static_cast< vector<string> >(NULL);
    Ce que tu fais là, c'est assigner vReturn à NULL (adresse 0x000000), d'où le crash.

    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string> vReturn;
    Serait infiniment mieux.

    Si je puis me permettre quelques remarques, ton code comporte plusieurs choses "pas jolies":

    -> les cast. Pourquoi tant de cast. Je n'ai pas tout regardé mais ceux que j'ai vu étaient inutiles. Les casts sont à éviter tant que faire se peux, et surtout les static_cast.

    -> ton code est un mélange de C et de C++. Par exemple, les sprintf, strncopy, sont des fonctions C. En C++ on utilise les flux et les fonctions membres de la classe string pour manipuler les chaines de caractère (voir la faq c++).

    -> pour les fichiers, ils est conseillé d'utiliser les flux (fstream) plutôt que des choses comme WIN32_FIND_DATA qui ne sont pas standard, ni portable, ni rien. A voir également la lib boost::file_system qui fournit beaucoup d'outils puor cela.

    -> les char* c'est mal. Utiliser la classe string.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oups j'ai lu en diagonal !, j'avais pas vu l'affection à null, le clear derrière sur le pointeur null provoque l'erreur...

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Points : 43
    Points
    43
    Par défaut
    Bon j'ai corrigé selon vos conseils ... effectivement ça fonctionne mieux ...

    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
    /**
    * \brief Fonction qui liste les répertoire dans un dossier
    * \param strFolder dossier a vérifier
    * \return tableau contenant la liste des répertoires
    */
    vector<string> ListingFolder(const string& strFolder)
    {
    	WIN32_FIND_DATA File; // Va contenir les informations de la recherche
    	HANDLE liste = NULL; 
    	vector<string> vReturn;
    	vReturn.clear();
     
    	string strTmp = strFolder;
     
    	if ( strTmp[strTmp.size()-1] != '\\')
    		strTmp += "\\*.*";
    	else
    		strTmp += "*.*";
     
    	//On cherche le premier Fichier
    	liste = FindFirstFile( strTmp.c_str(), &File ); 
    	if ( liste == INVALID_HANDLE_VALUE ) 
    		return vReturn; 
    	else 
    	{
    		if (File.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
    		{
    			string strFileName = "\\"; 
    			strFileName.append(File.cFileName);
    			vReturn.push_back(strFolder+strFileName);
    		}
    	}	
     
    	//Tant qu'il existe un fichier suivant
    	while ( FindNextFile( liste, &File ) ) 
    	{ 
    		//Si ce fichier est un répertoire
    		if ( File.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) 
    		{
    			//On ajoute le fichier, à la liste
    			string strFileName = "\\"; 
    			strFileName.append(File.cFileName);
    			if ( (strFileName != "\\..") && (strFileName != "\\."))
                    vReturn.push_back(strFolder+strFileName);
    		} 
    	} 
     
    	//On arrete la recherche.
    	FindClose( liste ); 
    	return vReturn;
    }
    En fait j'utilise un outil de contrôle statique de code source pour être en rapport avec les normes imposées pour mon projet.

    Une de ces normes imposées est l'affectation d'une valeur a chaque déclaration de variables. Comme je devais affecter une valeur a mon vector, je l'ai mis a NULL. Et bien c'etait une erreur.

    Même chose pour les cast : ils doivent être explicite (et avec les MFC c'est l'horreur).

    Sinon pour l'utilisation des flux standard, j'avoue, j'aurais pu faire mieux.
    Mais mon application n'a pas besoin d'être portable.

    Et pour les char*, j'avoue également ...

    En tout cas merci !

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Y'a quand même la sécurité en plus de la portabilité !

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Une de ces normes imposées est l'affectation d'une valeur a chaque déclaration de variables.
    C'est moi où ça ressemble à "l'application débile d'une règle de codage C à du code C++" ?

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

Discussions similaires

  1. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  2. [VBS] Erreur sur "AddWindowsPrinterConnection"
    Par Admin dans le forum VBScript
    Réponses: 5
    Dernier message: 27/03/2004, 16h15
  3. Erreur sur serveur lié
    Par k-lendos dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/03/2004, 15h21
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Erreur sur le TNSListener après installation de 9iAS
    Par Patmane dans le forum Installation
    Réponses: 4
    Dernier message: 04/02/2004, 11h16

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