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

Langage C++ Discussion :

std::vector, méthode push_back() et back() erreur imcompréhensible !


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut std::vector, méthode push_back() et back() erreur imcompréhensible !
    Bonjour,

    Voici bientôt 2 heures que je bute sur la même erreur, voici le bout de code en question:
    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
     
    // Ici une méthode static de Server appelé par un thread
    // data est une référence vers ma classe Server
    void* Server::loopISA(void* data){
    	Server* _this = reinterpret_cast<Server*>(data);
    	while(true) {
     
    		// Je parcours une liste de client
    		vector<struct Client>::iterator it;
    		for (it = lsClient.begin(); it!=lsClient.end ();++it) {
     
    			// Je créér une instance d'une Classe MessageTimer 
    			MessageTimer mISA(Message(Message::ISA,"Are you alive?")); 
    			mISA.setReceiver(it->sin);
    			mISA.send(_this->_sockfd); //Message bien envoyé et recu à l'addresse it->sin 
     
    			// lsSendBackMsg est un attribut de ma classe Server: vector<MessageTimer>	lsSendBackMsg;
    			_this->lsSendBackMsg.push_back(mISA);
     
    			cout << "port:" << ntohs(_this->lsSendBackMsg.back().getReceiver().sin_port) << "=?=" << ntohs(mISA.getReceiver().sin_port) << endl;
    			cout << "type:" << _this->lsSendBackMsg.back().getType() << "=?=" << mISA.getType() << endl;
    Mon Objet mISA s'affiche parfaitement bien: mISA.getReceiver().sin_port et mISA.getType() retourne bien ce qu'il faut, en revanche une fois inséré dans ma liste avec lsSendBackMsg.push_back(mISA); l'objet lsSendBackMsg.back() me retourne n'importe quoi:

    Voici un éxemple d'éxécution: (aucune erreur/warning à la compilation)
    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
     
    // port=40765 et type=13 attendu 
    port:0=?=40765 
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
     
    port:52489=?=40765
    type:13=?=13
     
    port:52489=?=40765
    type:13=?=13
     
    port:52489=?=40765
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
     
    port:0=?=40765
    type:13=?=13
    Je précise qu'il n'y a aucun autre thread lancé en concurrence, il n'y a que ce thread qui modifie et parcours cette liste pendant l'éxécution de mon programme...

    Merci de votre aide,

    @J'ajoute le code des classes MessageTimer et Message (ne sait-on jamais...)
    Je n'ai laissé que les méthodes utilisées.
    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
     
    #ifndef _Message_hh
    #define _Message_hh
     
    #include <vector>
    #include <string>
    #include <cstdlib>
    #include <cstdio>
    #include <iostream>
    #include <sstream>
     
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
     
    #include <stdarg.h>
    #include <string.h>
     
    #define CONTENT_SIZE 510
     
    using namespace std;
     
    class Message {
     
    	private:
    	int 	_type;
     
    	char	_c_content[CONTENT_SIZE];
    	int 	_c_offset;
     
     
    	struct sockaddr_in		sender;
    	struct sockaddr_in 		receiver;
     
    	//Construction par buffer
    	public: 
     
    	//Construction par type + content
    	Message(int type=0,const string& content=""){
    		_type=type;
     
    		strcpy(_c_content,content.c_str());
    		_c_offset=content.length();
    	}
     
    	//Construction par copie
    	Message(const Message& msg){
    		*this=msg;
    	}
     
    	Message& operator=(const Message& msg){
    		for(int i=0;i<(int)msg._c_offset;i++) 
    			_c_content[i]=msg._c_content[i];
    		_c_offset=msg._c_offset;
    		_type=msg._type;
    		return *this;
    	}
     
    	// Envoie le message au receiver
    	void send(int sockWrite){
    		// un sendto() ....
    	}
     
     
    	//Getter & Setter
    	public: 
    		//getter,setter Adresse recepteur
    		void setReceiver(const sockaddr_in &sin){
    			receiver=sin;
    		}
     
    		const sockaddr_in& getReceiver() const {
    			return receiver;
    		}
     
     
    		const int getType() const{
    			return _type;
    		}
    };
    #endif
    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
     
    #ifndef _MessageTimer_hh
    #define _MessageTimer_hh
     
    #include "Message.hh"
    #include <time.h>
     
    class MessageTimer: public Message {
     
    	private:
    	time_t	_time;
    	int	_nbSendBack;
     
    	public:
    	// Construction d'un messageTimer
    	MessageTimer(const Message& msg,const int nbSendBack=0): Message(msg) {
    		_time=time(NULL);
    		_nbSendBack=nbSendBack;
    	}
    };
    #endif

  2. #2
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,
    un vector<>::push_back va ajouter un élément dans le vecteur qui sera la copie du paramètre passé.

    Or le constructeur par recopie de Message (qui sera appelé par celui de MessageTimer) appelle l'opérateur = :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	Message(const Message& msg){
    		*this=msg;
    	}
     
    	Message& operator=(const Message& msg){
    		for(int i=0;i<(int)msg._c_offset;i++) 
    			_c_content[i]=msg._c_content[i];
    		_c_offset=msg._c_offset;
    		_type=msg._type;
    		return *this;
    	}
    et ce dernier ne recopie les membres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	struct sockaddr_in		sender;
    	struct sockaddr_in 		receiver;
    qui resterons donc dans leurs états précédents, c'est-à-dire non initialisés dans le cas de l'appel du constructeur par recopie.

Discussions similaires

  1. Probleme avec std::vector push_back
    Par raphchar dans le forum C++
    Réponses: 4
    Dernier message: 19/12/2011, 14h18
  2. Réponses: 8
    Dernier message: 29/07/2009, 12h22
  3. Push_back() de std::vector
    Par tir0nik dans le forum SL & STL
    Réponses: 10
    Dernier message: 03/05/2009, 19h26
  4. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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