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 :

Iterator & template


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut Iterator & template
    Bonjour!

    J'aurais une petite question pratique.

    Lorsque j'utilise un It�rateur de vecteur comme celui ci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IterateurVec<char *> it(Admin);
    
    	do{
    		if((char *)it!=NULL)
    		{
    			if(strncmp((char *)it, loginPass, 61)==0) //Si on a une correspondance
    			{
    				*tu=typeUtilisateur(nomUtilisateur);
    				strncpy(currentUser, nomUtilisateur, 30);
    				return 1;
    			}
    		}
    	}while(++it);
    Lors de l'instance de cet it�rateur, suis je dans le vrai si je dis que cet it�rateur alloue de la m�moire pour pouvoir stocker Admin(qui ici est un vecteur de char*)?

    Le fait est que lorsque j'utilise cet it�rateur, la fonction se passe sans souci et ensuite je dois lancer un menu qui me lache un segmentation fault. Le core dumped survient pendant la ligne de code qui est en gras ci dessous:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    menu::menu(char *opt[], int nbElemC)
    {
    	nbElem=nbElemC;
    	for(int i=0; i<nbElem; i++)
    	{	
    		
    		nom[i]=new char[strlen(opt[i])+1];
    		
    		strcpy(nom[i], opt[i]);
    	}
    }
    Lorsque je n'utilise pas l'it�rateur plus haut, le menu se lance sans probl�me. Mais avec l'utilisation de l'it�rateur, le segmentation fault survient.

    Dois-je lib�rer la m�moire allou� par l'it�rateur pour pouvoir lancer mon menu? Si oui, comment faire?

    Merci d'avance.

    Edit: Je sais que le char*, c'est moins beau que le string. Donc d'avance d�sol�

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par d�faut
    Bonjour,
    Est-ce que "vecteur de char" et IterateurVec d�signe les std::vector + it�rateur de la biblioth�que standard ou des classes persos ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    D'o� sortent ces it�rateurs, c'est de la STL ? Pardon d'avance, je vais �tre un peu cru, mais �a c'est n'importe quoi :

    Et on le retrouve ailleurs dans le code. Tu fais un cast C-Style sans aucun check sur un type qui n'est � priori pas convertible dans le type cible. Pour moi ton code � un comportement ind�termin�.

    Ce code a du sens :

    Lorsqu'il est utilis� � bon escient. Vas donc un peu lire la doc sur les it�rateurs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Bon pour pr�ciser, ce sont des templates vecteurs perso. Pas de la biblioth�que standard (obligation scolaire)

    Et la fonction de l'it�rateur marche.

    Le probl�me r�side dans le fait que j'ai un segmentation fault dans l'instanciation de mon menu quand j'utilise l'it�rateur.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Je vous met la d�finition de la class Vecteur et de l'iterateur de Vecteur

    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
    102
    103
    104
    105
    106
    107
    #include <stdlib.h>
     
    #include <iostream>
     
    #include <string.h>
    #include <stdio.h>
     
     
    #include "Carte.h"
     
     
    template <class T>class IterateurVec;
     
     
    #ifndef DEF_MYVECTOR
     
    #define DEF_MYVECTOR
     
    	template<class T> class MyVector
     
    	{
     
    		protected:
     
    			T *data;
     
    			int *vecPlace;
     
    			int nbrElem;
    			int nbElemPos;
     
    		public:
     
    			MyVector(int n=10);
     
    			~MyVector();
     
     
     
    			void setElement(int indice, const T &valeur);
     
    			bool setElement(const T &valeur);
     
     
     
    			T getElement(int indice)const;
    			int getNbElem()const;
     
    			int getNbElemPos();
     
     
    			void affiche(void)const;
     
     
     
    			bool indiceValide(int indice)const;
     
    			bool estOccupe(int indice)const;
     
    			T retireElement(int indice);
     
     
     
    			void operator+(const T &o);
     
    			friend class IterateurVec<T>;
     
    	};
     
    #endif
     
    #ifndef ITERATEUR_VEC
    #define ITERATEUR_VEC
     
    	template <class T>class IterateurVec
    	{
    		protected:
    			MyVector<T>& pObj;
    			T* pData;
    			int nbElem, pos;
    		public:
    			IterateurVec(MyVector<T>& obj):pObj(obj), pData(obj.data), nbElem(obj.getNbElemPos()), pos(0) {};
     
    			void reset()
    			{ 
    				pData=pObj.data; 
    				nbElem=pObj.getNbElemPos();
    				pos=0;
    			}
     
     
    			int operator++()
    			{
    				if(pos<nbElem)
    				{
    					pData++;
    					pos++;
    					return 1;
    				}
    				else
    					return 0;
    			}
    			operator T()const{return *pData;}
    			T& operator&(){return *pData;}
    	};
     
    #endif

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Personne ne peut m'aiguiller sur le pourquoi du segmentation fault � cet endroit?

    Le seg fault, c'est bien reli� � la m�moire? Vu que le probl�me survient lorque j'essaye d'allouer un new char...

    Personne n'a une id�e de comment contrer cette erreur?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Le probl�me survient aussi quand (m�me ligne) tu tentes d'acc�der � opt[i]. Es-tu certain du contenu de ce tableau? De la validit� des pointeurs? Que les chaines n'ont pas �t� d�sallou�es et remplac�es par n'importe quoi, avec un \0 terminal manquant?
    As tu essay� d'obtenir + d'info avec un logiciel comme valgrind (�a ne fait pas le caf�, mais �a aide souvent...)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Merci de ta r�ponse.

    Le truc c'est que je suis parti sur un menu plus simple qui n'utilise pas allocation comme �a j'esp�re ne plus avoir le probl�me.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Dans beaucoup de cas la solution d'un bug d'allocation dynamique est...d'�viter l'allocation dynamique. EDIT: pour plus de clart� je pr�cise: allocation dynamique � la main
    Pour l'avenir (autres TP, ou boulot, sans la contrainte no STL), rappelle-toi que pour les tableaux � longueur variable les std::vector font la gestion de m�moire pour toi ==> rien de tel pour �viter les soucis de gestion dynamique de m�moire

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Oui de fait mais ils aiment bien NE PAS utiliser les fonctions d�ja disponible pour tout le monde

    Faut faire avec

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par fex79 Voir le message
    Personne ne peut m'aiguiller sur le pourquoi du segmentation fault � cet endroit?
    Le seg fault, c'est bien reli� � la m�moire? Vu que le probl�me survient lorque j'essaye d'allouer un new char...
    Personne n'a une id�e de comment contrer cette erreur?
    Tu as r�solu le probl�me ? Comment finalement ? En g�n�ral, un segfault s'identifie assez facilement en lan�ant un coup de d�bugger.

    Je persiste � te d�conseiller les cast C-Style, c'est se cr�er des ennuis.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Je l'ai pas r�solu...

    J'ai juste contourner le probl�me, au lieu d'utiliser un menu qui demande une allocation de m�moire, j'ai fait un menu plus simple...

    Mais si tu me d�conseilles le cast (char*) comment puis-je caster correctement alors dans cette fonction?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IterateurVec<char *> it(Admin);
     
    	do{
    		if((char *)it!=NULL)
    		{
    			if(strncmp((char *)it, loginPass, 61)==0) //Si on a une correspondance
    			{
    				*tu=typeUtilisateur(nomUtilisateur);
    				strncpy(currentUser, nomUtilisateur, 30);
    				return 1;
    			}
    		}
    	}while(++it);
    Pcq on m'a toujours dit de faire comme �a...

  13. #13
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    Je persiste � te d�conseiller les cast C-Style, c'est se cr�er des ennuis.
    Il y est oblig� dans ce cas malheureusement.
    C'est vraiment flippant, mais le seul moyen pour acc�der aux donn�es point� par l'it�rateur est d'utiliser... l'op�rateur de cast fourni avec

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <class T>class IterateurVec
    {
    protected:
       T* pData;
    //...
    public:
       operator T() const {return *pData;}
    };
    Citation Envoy� par fex79
    Mais si tu me d�conseilles le cast (char*) comment puis-je caster correctement alors dans cette fonction?
    D'habitude, par convention on d�r�ference un it�rateur pour acc�der � la donn�e point�e par l'it�rateur (en utilisant la m�me syntaxe que pour les pointeurs justement pour indiquer le lien de parent� entre le concept d'it�rateur et de pointeur)

    Donc un it�rateur classique s'utiliserait comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    do{
       if((*it) !=NULL)
       {
          if(strncmp(*it, loginPass, 61)==0) //Si on a une correspondance
         {
        ...
    Bon l�, clairement dans ta boite fex79 ils ont fait plus original, car utiliser un op�rateur de cast (qui est quand m�me une feature relativement obscure du langage) pour acc�der � un it�rateur c'est pas banal

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    D�cembre 2011
    Messages
    17
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 17
    Par d�faut
    Merci pour ces pr�cisions!

    J'ai quand m�me l'impressions que ces cast m'apportent quelques soucis.

    Penses tu que mes seg fault seraient d� � ces cast?

  15. #15
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    A mon avis, le probl�me est peut �tre li� � l'it�rateur, au cast, mais cela n'a rien d'�vident. Je soup�onne opt[i] de n'�tre plus valide et de retourner une longueur compl�tement improbable (ou d'adresser une zone non adressable).
    Le code que tu nous propose 'sent' les probl�mes. L'allocation dynamique est tr�s difficile � g�rer et rien que de voir des chaines de caract�res � la 'C' m'inqui�te.

    Puisque tu ne peux utiliser la STL (va dire � ton prof que je pense que c'est compl�tement d�bile), � mon avis, commence par :
    => "R�impl�menter" une version simple mais suffisante pour toi de std::string et oublie les const char*. L'important est de bien comprendre le RAII et en particulier la n�cessit� de bien g�rer la copie : cf G�rer ses ressources de mani�re robuste en C++ par Aur�lien Regat-Barrel et Pr�sentation des pointeurs intelligents en C++ par Lo�c Joly
    => Idem avec les vecteurs. N'h�site pas � regarder comment la STL fait pour t'en inspirer librement. (au passage ta classe n'impl�mente pas la copie ce qui peut �tre tr�s probl�matique)
    => Cherche � bannir les allocations dynamiques explicites aux profits d'enveloppes RAII d�di�es.
    => Suis au plus pr�s le fonctionnement des it�rateurs de la STL. Ce sera moins surprenant pour tout le monde.
    En particulier :
    ton op�rateur ++ n'est pas usuel.
    tu devrais utiliser * pour acc�der � l'�l�ment et non un op�rateur de conversion
    reset n'a pas de sens
    Un op�rateur == (et !=) devrait exister pour comparer
    On devrait obtenir un it�rateur de d�but et de fin sur un vecteur � partir du vecteur. Le constructeur de l'it�rateur en donnant en argument un vecteur n'a pas de sens.

    (tu as trop de membre dans ta classe, les attributs devraient �tre priv�s et non prot�g�s)

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    734
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 734
    Par d�faut
    Citation Envoy� par 3DArchi Voir le message
    ton op�rateur ++ n'est pas usuel.
    tu devrais utiliser * pour acc�der � l'�l�ment et non un op�rateur de conversion
    reset n'a pas de sens
    Un op�rateur == (et !=) devrait exister pour comparer
    On devrait obtenir un it�rateur de d�but et de fin sur un vecteur � partir du vecteur. Le constructeur de l'it�rateur en donnant en argument un vecteur n'a pas de sens.
    En fait, son interface fait sens en tant que...reprise approximative de celle des iterateurs java (je le sais, je travaille le plus souvent en java). L'it�rateur en java ne repr�sente pas une borne, mais le processus entier d'it�ration: on l'initialise avec la liste (g�n�ralement c'est la classe de collection qui sert de factory, l'it�rateur est r�f�renc� par l'interface Iterator), il offre des fonctions membres pour avancer dans l'it�ration, v�rifier si elle est finie ou non, et r�cup�rer la valeur.
    Ceci dit, � rome on fait comme les romains, en en C++ comme en C++...question d'efficacit�.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. D�claration d'iterator dans template
    Par artefactman dans le forum C++
    R�ponses: 2
    Dernier message: 10/06/2012, 11h36
  2. Iterator et Template
    Par loman02 dans le forum Langage
    R�ponses: 5
    Dernier message: 27/03/2008, 15h02
  3. Map::iterator et template
    Par kast_or dans le forum Langage
    R�ponses: 3
    Dernier message: 28/11/2006, 19h15
  4. Erreur Gcc, template et iterator
    Par aidos dans le forum Langage
    R�ponses: 7
    Dernier message: 14/03/2006, 09h04
  5. Template et iterator.
    Par tibtib17 dans le forum Langage
    R�ponses: 5
    Dernier message: 29/07/2005, 14h06

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