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 :

problème vector nouvelle version


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut problème vector nouvelle version
    bonjour,

    j'ai posté il n'y a pas longtemps sur ce forum mais la discussion était un peu rebutante

    j'ai réussi à isoler mon problème et à le simplifier. je pense qu'il est résumé dans le code ci dessous:

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    #include "stdafx.h"
    #include <string>
    #include <vector>
    #include <sstream>
    #include <iostream>
    #include <fstream>
    #include "math.h"
    using namespace std;
     
     
    void VC3( vector< double > & coord ) 
    {
      string line;
      ifstream myfile ("test3.txt");
     
     
      if (myfile.is_open())
      {
     
         coord.reserve(1200);
        while ( getline (myfile,line))
          {
     
          stringstream ss(line);  
     
    	double nombre1;
        double nombre2;
    	double nombre3;
    	char   sep;
     
     
    	while(ss >> nombre1 >> sep >> nombre2 >> sep >> nombre3)
    	    {
    		coord.push_back(nombre3);
    	    }
     
          }
     
        myfile.close();
      }
     
      else cout << "Unable to open file"; 
     
     
    }
    void Color( vector< int > &lightcolor ) 
    {
    vector< double > heightmap;
        VC3( heightmap ); //fonction qui remplit le vector heightmap
     
    	int s=1156;
     
        int size=34;
     
    	lightcolor.resize(s);
    	int X=0;
    	int Y=0;
    	int index;
    	int index2;
     
    	 int a = Y * size  + X;
    	while (1)
    	{
    		while(1)
    	     {
     
    			  index = Y * size  + X;
    			 index2 = Y * size  + X;
    			  vector<int>::iterator it = lightcolor.begin()+index;
                  vector<double>::iterator it2 = heightmap.begin()+ index2;
     
    			  *it=*it2;
    		 X++;
                     if(X >= size) break;
    		}
    		X=0;
    		Y++;
                 if(Y >= size) break;
    	}
    }
     
     
    int main ()
    {
      vector< double > heightmap;
        VC3( heightmap );
     
    	vector< int > IntersectMap;
        Color( IntersectMap );
     
    	int s =1156;
     
    	for (int i = 0 ; i <s ; i++)
    	{
           cout << IntersectMap[i]<< endl;
     
    	}
        cout << heightmap.size() << endl;
      return 0;
    }
    ca s'execute sous visual mais pas avec le .exe
    ca marque "iterator no deferencable". j'ai donc un problème de taille de vector. et ce problème vient de l'appel de heightmap dans la fonction IntersectMap. Mais même avec le debugger je n'arrive pas à le voir.

    je vous avouerai que ça fait plusieurs jours que je m'arrache les cheveux avec mon programme, ça me ferait du bien que vous me sortiez de la m...

    merci!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    J'ai juste jeté un oeil :
    Ce type de ligne me paraît suspect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<double>::iterator it2 = heightmap.begin()+ index2;
    En effet, tu ne contrôles pas si ton itérateur ne pointe pas au delà de ton vecteur.
    Dans l'exemple précédent, ne rencontrerais-tu pas des cas où heightmap.size() est inférieur à index2 ?

    Petit conseil qui te permettra de debugger plus facilement (à condition que tu ajoutes une gestion des exceptions) :

    Utilise :
    Plutôt que :
    Dans le premier cas, une exception est levée en cas de dépassement de la taille du vecteur.

    Cordialement,
    A.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    std::vector::at() c'est lent... La plus part des compilo implémente déjà un contrôle de dépassement sur l'opérateur [] en debug.

    Mais sinon je plussoie pour l'itérateur.



    ah et en passant le while(1) + break ... c'est moyen.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Re-Bonjour,

    Si tu veux, transmet-moi un de tes fichiers d'entrée (fichier3.txt ?) de manière à reproduire le problème...

    Cordialement,
    A.

    PS :
    Point absolument illogique dans la fonction VC3 :
    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if (myfile.is_open())
         // lecture du fichier
      else 
         cout << "Unable to open file";
    Le test est inversé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      if (myfile.is_open())
      {
          cout << "Unable to open file"; 
          return;
      }
      // ici, Le fichier n'est pas ouvert, tu peux commencer le traitement...
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  5. #5
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Yeah, du code qui compile !

    Alors, le problème du "iterator not dereferencable" chez moi vient bien du fait que le code essaye d'accéder à un itérateur situé au-dela de la fin d'un vecteur.

    Si je rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lightcolor.resize(s);
    heightmap.resize(s);  // ajout
    Ca passe.
    Donc, à mon avis, avant chaque boucle, il faudrait que tu blindes ton code d'assert pour détecter quel vecteur met le bazar.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    assert(heightmap.size() == s);
    assert(lightcolor.size() == s);
    while (1)
    {
       while(1)
       {
    //...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    assert(IntersectMap.size() ==s);
    for (int i = 0 ; i <s ; i++)
    {
           cout << IntersectMap[i]<< endl;
    }

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    pourquoi c'est illogique?
    si le fichier est ouvert, je continue
    sinon, je mets un message d'erreur

    non?

    et je fais comment pour te transmettre le txt ?


    sinon normalement je définis mon "s" grace à heightmap : s= heightmap.size()
    [EDIT]
    et moi le .exe ne fonctionne toujours pas, même avec heightmap.resize(s) !?
    [EDIT 2]
    ce que j'aimerai comprendre c'est pourquoi j'ai un problème pour utiliser heightmap avec un indice variant de 0 à 1155 alors que je l'ai rempli grace à VC3. je souligne que mon fichier test3.txt possède 1156 lignes. donc heightmpa est censé contenir 1156 éléments.

    alors d'ou vient le problème?

    vous avez donné plein de moyen de verifier les bugs, mais le programme fonctionne très bien sous visual. il renvoie les bonnes valeurs. alors pourquoi le .exe plante?

    si une assertion est fausse (du genre assert i =2) comment faire pour lui demander de renvoyer la valeur de i ?

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Par hasard, ca ne viendrait pas du fait que le répertoire d'exécution sous Visual soit le répertoire de la solution (qui n'est pas celui de l'exe), et que ton fichier txt ne soit pas dispo quand tu cliques sur l'exe ?
    --
    Jérémie
    Jérémie

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    tu marques un point. voire plus...

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut

    Il ne te reste plus qu'a traiter cette erreur correctement.
    --
    Jérémie
    Jérémie

Discussions similaires

  1. Problème avec nouvelle version
    Par climsoldev dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 04/06/2014, 13h40
  2. Réponses: 2
    Dernier message: 04/01/2013, 00h51
  3. Problème avec nouvelle version de Chrome
    Par rikidi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/02/2011, 16h32
  4. [MAJ][Problème]DevExpress Nouvelle version
    Par Rhend dans le forum ASP.NET
    Réponses: 0
    Dernier message: 28/09/2010, 11h20
  5. Problème avec nouvelle version de g++
    Par ValyGator dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 31/03/2009, 17h22

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