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

Visual C++ Discussion :

Gestion de vectors, problème d'allocation de mémoire ?


Sujet :

Visual C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut Gestion de vectors, problème d'allocation de mémoire ?
    Bonjour,

    dans une fonction que j'ai créée, je cherche à récupérer des données dans un fichier CSV. Vu que je ne connais pas le nombre de données, j'ai décidé de le stocker dans un vector.

    La compilation se passe sans problème, mais à chaque fois que j'exécute le programme, il plante en me donnant l'erreur : "Expression: vector subscript out of range".

    J'ai essayé de gérer l'allocation de mémoire de façon à m'assurer de ne plus avoir cette erreur, mais il doit y avoir quelque chose qui m'échappe, puisque je n'arrive pas à m'en débarrasser.

    La déclaration de mes vectors :

    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
    #include <vector>
    #include <fstream>
     
    typedef std::vector<float> lf;
    typedef std::vector<std::string> ls;
     
    // CGestionFichier
     
    class CGestionFichier
    {
    private:
    	char* nomFichier;
    	std::fstream fichier;
    	std::vector<ls> dataBrute;
    	std::vector<std::string> legende;
    	std::vector<lf> donnees;
    La fonction de récupération dans le fichier :

    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
    void CGestionFichier::stockageData()
    {
    	if (ouvertureFichier())
    	{
    		char *tempLigne, *tempData;
    		int i, j;
    		int ligne = 0, colonne = 0;									// Position dans le vecteur dataBrute (tableau dynamique)
    		int colMax = 0;
     
    		tempLigne = new char;
    		tempData = new char;
     
    		//		Comptage des lignes et allocation de la mémoire pour le tableau
    		////////////////////////////////////////////////////////////////////////////////////////////
    		while (fichier.getline(tempLigne, 256))
            {
    			ligne++;
            }
    		dataBrute.resize(ligne);
     
    		//		Comptage des colonnes et allocation de la mémoire pour le tableau
    		////////////////////////////////////////////////////////////////////////////////////////////
    		ligne = 0;
    		while (fichier.getline(tempLigne, 256))
            {
    			i=0;
    			while (tempLigne[i] != '\0')
    			{
    				if (tempLigne[i] = ';')
    				{
    					colonne++;
    				}
    				i++;
    			}
    			dataBrute[ligne].resize(colonne);
    			ligne++;
    			colonne=0;
            }
     
    		//		Récupération des données
    		////////////////////////////////////////////////////////////////////////////////////////////
    		ligne = 0;
    		while (fichier.getline(tempLigne, 256))						// Tant qu'on arrive à obtenir une ligne et la stocker dans une chaine de 256 caractères
            {
    			i=0;													// On initialise les itérateurs
    			j=0;
    			colonne = 0;											// On revient à la première colonne du tableau
     
    			while (tempLigne[i] != '\0')							// Tant qu'on n'a pas le caractère de fin de chaîne
    			{
    				if (tempLigne[i] = ';')								// Si on arrive à un ';', fin de donnée donc copie
    				{
    					tempData[j] = '\0';								// On termine la chaîne
    					dataBrute[ligne][colonne] = "";					// On initialise
    					dataBrute[ligne][colonne] += tempData;			// On copie
    					colonne++;										// On passe à la valeur suivante dans la ligne du tableau
    					j = 0;											// On revient au premier caractère de la chaîne temporaire
    				}
    				else												// Si on a autre chose qu'un ';'
    				{
    					tempData[j] = tempLigne[i];						// On copie le caractère dans la chaîne temporaire
    					j++;											// On passe au caractère suivant dans la chaîne temporaire
    				}
    				i++;												// On passe au caractère suivant dans la ligne
    			}
    			ligne++;												// On passe à la ligne suivante dans le tableau
            }
    		fermetureFichier();
    	}
    }
    Les autres fonctions utilisant les vectors :

    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
    void CGestionFichier::recupLegende()
    {
    	legende.resize(dataBrute.size());
    	for (unsigned int i = 0; i < dataBrute.size(); i++)
    	{
    		legende[i] = dataBrute[i][0];
    	}
    }
     
    void CGestionFichier::recupDonnees()
    {
    	donnees.resize(dataBrute.size());
    	for (unsigned int i = 0; i < dataBrute.size(); i++)
    	{
    		donnees[i].resize(dataBrute[i].size() - 1);
    		for (unsigned int j = 0; j < (dataBrute[i].size() - 1) ; j++)
    		{
    			donnees[i].push_back(atof(dataBrute[i][j + 1].c_str()));
    		}
    	}
    }
     
    const char* CGestionFichier::getLegende(int i)
    {
    	return legende[i].c_str();
    }
     
    float CGestionFichier::getDonnee(int i, int j)
    {
    	return donnees[i][j];
    }
    Merci d'avance pour votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    Bon, comme d'hab, j'ai fini par trouver tout seul. Il s'agissait d'un problème au niveau de l'appel, avec des limites de parcours de tableau que j'avais laissé fixe.

    Maintenant, j'ai un autre problème à ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier.getline(tempLigne, 256)
    encore un plantage au moment du runtime, avec l'erreur :
    "HEAP[AppliGraphe.exe]: Invalid address specified to RtlValidateHeap( 01FA0000, 02FC94F0 )"

    EDIT : Bon, là encore j'ai trouvé d'où ça vient. Il fallait que je crée des tableaux et non pas simplement des pointeurs. Cependant, comme je ne récupère pas les données de mon fichier, je laisse ouvert.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    Bon, voilà, j'ai fini par tout débugger. J'avais quelques erreurs toutes bêtes comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (tempLigne[i] = ';')
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (tempLigne[i] == ';')
    et je me suis aussi rendu compte que je lisais pas la dernière colonne. En effet, je sors directement de ma boucle "while", et comme il n'y a pas de point-virgule en fin de ligne, le "do-while" ne serait pas plus utile.

    J'ai donc incrémenté la variable "colonne" à la sortie de ma boucle de comptage, et j'ai aussi ajouté ce bout de code à la sortie de ma boucle d'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tempData[j] = '\0';
    dataBrute[ligne][colonne] = "";
    dataBrute[ligne][colonne] += tempData;

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

Discussions similaires

  1. Problème d'allocation de mémoire: Fatal error: Allowed memory
    Par Arget dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/09/2011, 07h55
  2. problème d'allocation de mémoire pour la JVM
    Par Sfaxiano dans le forum Général Java
    Réponses: 13
    Dernier message: 06/05/2010, 20h16
  3. problème d'allocation de mémoire
    Par NomadSoul123 dans le forum C++
    Réponses: 2
    Dernier message: 18/10/2007, 11h08
  4. problème d'allocation de mémoire
    Par kreel dans le forum C
    Réponses: 10
    Dernier message: 28/04/2007, 14h40
  5. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22

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