erreur itérateur

erreur itérateur - C++ - Programmation

Marsh Posté le 11-12-2005 à 17:53:06    

Salut à tous, j'utilise un itérateur sur un vector mais j'ai une erreur, voici mon code :
 

Code :
  1. for (iterListFich i = laListe.begin(); i != laListe.end(); i++)
  2. {
  3.     cpt++;
  4.        
  5.     Flot F(*i);
  6.        
  7.     if ( F.ValideFlot() )
  8.     {
  9.         temp = F.LireMot();
  10.         while (temp != "" )
  11.         {
  12.             C.Add ( temp, cpt, F.NumLigne() );
  13.             temp = F.LireMot();
  14.         }
  15.     }
  16.     else
  17.     {
  18.         cout << "le Fichier " << *i << " n'est pas accessible ";
  19.         cout << "en lecture.";
  20.     }
  21.     F.FermerFlot();
  22. }


 
*iterListFich est un typedef défini comme ceci dans une classe que j'utilise :
 

Code :
  1. typedef vector <string> listeFichiers;
  2. typedef listeFichiers::iterator iterListFich;


 
et l'erreur qu'il me met (sous visual studio) :
 
error C2040: 'i' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' differs in levels of indirection from 'int'
 
Il me dit que cette erreur vient de la ligne du for (for (iterListFich i = laListe.begin(); i != laListe.end(); i++))
 
Voila si quelqu'un peut m'aider ce serait bien sympa parce que moi je suis un peu perdu....

Reply

Marsh Posté le 11-12-2005 à 17:53:06   

Reply

Marsh Posté le 11-12-2005 à 18:06:47    

Quel est le type de laListe ?

Reply

Marsh Posté le 11-12-2005 à 18:11:05    

vector<string> laListe

Reply

Marsh Posté le 11-12-2005 à 18:23:46    

Code :
  1. #include <string>
  2. #include <vector>
  3. using std::string;
  4. using std::vector;
  5. typedef vector <string> listeFichiers;
  6. typedef listeFichiers::iterator iterListFich;
  7. int main()
  8. {
  9.     listeFichiers laListe;
  10.     for( iterListFich i = laListe.begin(); i != laListe.end(); ++i )
  11.     {
  12. //...
  13.     }
  14. }


 
Part de ce code minimal, et étoffe ton code, tu verras apparaitre l'erreur plus facilement.


Message édité par ++fab le 11-12-2005 à 18:24:13
Reply

Marsh Posté le 11-12-2005 à 18:29:01    

c'est bon j'ai vu d'ou venait l'erreur
c'est parce que dans un autre bloc (dans un for) je définis un int i :  
 

Code :
  1. for (int i; ... )
  2. {
  3. }
  4. iterListFich i;

Reply

Marsh Posté le 11-12-2005 à 18:36:42    

en plus c'est ce que je pensais. C'est un bug bien connu de ton compilo qui se vautre sur la portée des variables de boucle.

Reply

Marsh Posté le 19-12-2005 à 17:54:23    

yep et ton compilo est donc Visual C++ ;)
 
Sinon petites remarques en passant :  
-> n'utilise jamais 'i' comme nom de variable pour un itérateur, utilise plutot 'it' ou un nom plus explicite. (c'est pour la lecture du code)
 
-> utilise des const_iterator plutot que des iterators lorsque tu parcours un liste/map/vector/set sans modifier les éléments (plus rapide et évite de modifier un élément par mégarde, c'est valable pour tout 'const' d'ailleurs)
 
-> utilise la préincrémentation (++it) plutot que la post inc (it++), c'est une bonne habitude et tu gagneras qq cycles (sur les objets, tels que les itérateurs tu gagnes une allocation et parfois un appel de fonction si l'opérateur n'est pas inline)
 
En utilisant toutes ses suggestions voici ton code :
 

Code :
  1. typedef vector <string> listeFichiers;
  2. typedef listeFichiers::const_iterator constIterListFich;
  3. constIterListFich it;
  4. const constIterListFich itEnd = laListe.end();
  5. for ( it = laListe.begin() ; it != itEnd ; ++it )
  6. {
  7.     ++cpt;
  8.   ...... etc
  9. }


Message édité par Malkav le 19-12-2005 à 17:56:23
Reply

Marsh Posté le 19-12-2005 à 17:57:15    

pour le compilo en question, s'il s'agit de Visual C++ .NET (7.0) ou .NET 2003 (7.1), alors ce problème de compatibilité peut être résolu via une option à passer au compilateur (regarde dans la configuration de ton projet)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed