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 :

Membre d'une classe change sans raison


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Membre d'une classe change sans raison
    Bonjour,

    Lorsque je connecte 3 clients, ou plus, ma classe qui correspond a un client change un de ses membre sans aucune raison
    Pour faire court,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Session {
            public:
                    inline const int GetSocket() const { return sock; }
            private:
                    int sock;
    }
    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
     
    //[... plus de code]
            ConnectedClients = Collection->AllSessions(); // copie par reference des clients
    // de type: std::map<int, Session*>
     
            if(Collection->Count() == 3)
            {
                std::cout << "I have now 3 clients connected, let's echo their socket number !"<<std::endl;
                ConnectedClients = Collection->AllSessions();
     
                for(auto itr = ConnectedClients.begin(); itr != ConnectedClients.end(); ++itr)
                {
                    Target = itr->second; // de type Session*
                    sock = itr->first;
                    std::cout << "Key: " << sock << " & Session*->sock = " << Target->GetSocket() << std::endl;
                }
            }
     
            for(auto itr = ConnectedClients.begin(); itr != ConnectedClients.end(); ++itr)
            {
                Target = itr->second;
                sock = itr->first;
                std::cout << "Loop over : " << Target->GetSocket() << std::endl;
     
    //[... plus de code]
    Donc voila, entre la deuxieme boucle et la troisieme, la valeur de Target->GetSocket() change, voici un screenshot pour mieux comprendre...



    edit:
    J'ai ajouté en plus dans le code un std::cout sur l'adresse de Target pour voir si elle ne changait pas en cours de route, non elle est toujours bonne. Donc c'est bien le int sock; qui change d'un coup... !

    Evidemment, le reste du programme plante salement à cause de ca..

    Si vous avez des idées, je suis preneur!
    merci, nico

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    qui a t'il à la fin de la deuxième boucle ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    La valeur qui est affichée me fait beaucoup penser à une variable non initialisée.
    Serait-il possible que le 3° client soit supprimé de la liste avant d'en recréer un ?
    Peut-être un constructeur par copie incorrect ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Regarde la premiere boucle, elle lit les valeurs des clients également !
    Et elle marche tres bien, en revanche la 2e boucle, paf...
    Je comprend pas du tout comment c'est possible !

    Les valeurs dans le constructeur sont bonnes, et meme juste apres, elles sont encore bonnes, quand le 3e client arrivé, voila ce qu'il se passe:

    main thread
    - lock mutex
    - creer un objet session, le memoriser
    - ajouter le socket au desripteur de fichier
    - lacher le mutex
    thread de reception
    - on verifie si il y a des clients, et aussi si select > 0
    - la boucle donnée dans le premier post

    voici un screenshot avec les adresses:

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Si tu es sous Visual, passe en debug et utilise un DataBreakpoint
    Si tu es sous autre chose, il y a peut-être aussi un outil correspondant.
    Recherche dans tout le code où est modifié cette variable et debug à l'ancienne.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    je vien s de lancer un debug, et la y avait aucun changement etrange de variable <_<


    Et sans le debogage, ben vous avez l'image, ca foire...

Discussions similaires

  1. Taille texte d'une listbox change sans raison
    Par stressman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/04/2008, 00h21
  2. Objet vector<Type> membre d'une classe
    Par Chewbi dans le forum SL & STL
    Réponses: 3
    Dernier message: 16/02/2006, 17h12
  3. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  4. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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