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

SL & STL C++ Discussion :

vector et porté de variable


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 104
    Par défaut vector et porté de variable
    Bonjour,

    je dois remplir un tableau à deux dimension de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector < vector <char*> > monTableau;
    pour se faire j'utilise le code suivant :
    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
     
    	// while line != data  or EOF
        while ( (!monFichier.eof()) ) { // keep reading until end-of-file or line DATA
    	    // reset line vector
    	    ligne.clear();
        	// ligneLue read line
            monFichier.getline(ligneLue,2000);
    	  	// split using ','
    	  	ligneDecoupe = strtok(ligneLue,",");
    	  	while(ligneDecoupe != NULL){
    			// copy to the ligne vector
    			ligne.push_back(ligneDecoupe);
    			// split using ','
    			ligneDecoupe = strtok(NULL,",");
    	    }
    	    // add the line to the tablea
    	    monTableau.push_back(ligne);
     
     
            cout<<monTableau[i][0]<<endl;
     
    	    // number of line
    	    i++;
     
     
        }
    le tableau est bien rempli et il m'affiche correctement à l'écran le premier élément de chaque ligne
    mais dés que je sors de la boucle et que je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout<<monTableau[0][0]<<endl;
    il m'affiche une ligne vide.
    quand je demande la taille via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monTableau.size();
    il me retourne la bonne taille (3415 éléments)

    de même la taille d'une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout<<monTableau[0].size()<<endl;
    retourne la bonne taille (5 éléments).

    donc la question est pourquoi je n'ai plus accès à mes élements une fois sortie de ma boucle (je pencherai pour le ligne.clear() mais je ne vois pas comment ne pas l'utiliser )

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu mets des pointeurs dans ton tableau, mais ils pointent sur quoi ? Sur des caractères de ligneDecoupee, qui est une variable locale qui sera détruite à chaque ligne... Donc ça ne peut pas marcher. Dès que tu va lire ce sur quoi pointe le pointeur, il y aura un problème. La solution : vector < vector <string> > monTableau;

    A part ça, la lecture du fichier n'est pas bonne : http://cpp.developpez.com/faq/cpp/?p...s#FICHIERS_eof

    Et l'utilisation de strtok est une mauvaise idée (non réentrant, non multithread, modifiant les données d'entrée).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 104
    Par défaut
    merci beaucoup pour ton aide j'ai modifié le code et ça marche.
    pour les personnes qui serait intéressé plus tard :

    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
     
    // create data structure in memory
    vector < vector <string> > creerTableData(char* nomFichier){
     
    	// --------------
    	// local variable				   
    	// --------------	   
    	vector < vector <string> > monTableau; // table of DATA 
    	vector <string> ligne; // line of the table
        ifstream monFichier; // indata is like cin
    	istringstream ligneLue; // to read a line
    	string maLigne;
     
     
    	// open file in read only mode
        monFichier.open(nomFichier); // opens the file
        if(!monFichier) { // file couldn't be opened
          cerr << "Error: file could not be opened" << endl;
          exit(1);
        }
     
     
    	// while line != EOF
        while ( getline(monFichier,maLigne) ) { 
    	    // reset line vector
    	    ligne.clear();
    	    // translate into istringstream
    	    istringstream ligneLue(maLigne);
    	    // result of split
    		string mot;
    		// split using ','
    		while ( std::getline( ligneLue, mot, ',' ) )
    	    {
    	        // copy to the ligne vector
    			ligne.push_back(mot);
    	    }
     
    	    // add the line to the tablea
    	    monTableau.push_back(ligne);	    
     
        }
     
    	// close the file
       monFichier.close();
     
     
    	// return the vector*vector
    	return monTableau; 
    }
    il me reste plus qu'à me renseigner un peu plus sur le type string et revoir les vector (jamais vu ça à l'iut y'a 3 ans )

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

Discussions similaires

  1. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  2. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  3. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  4. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

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