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 :

warnings being treated as errors


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut warnings being treated as errors
    bonjour, je n'arrive pas à résoudre une erreur concernant un thread, j'ai une erreur de compilation qui concerne le constructeur de ma classe, et je ne voit pas le rapport entre le constructeur de la classe et le thread. J'aimerais qu'on m'explique pourquoi j'ai cette erreur de compilation.

    voici le code de ma classe :
    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
     
    #include "Interpretor.h"
    #include "Control.h"
     
    using namespace std;
     
     
    Control :: Control(Chlist * clist)
    {
    	this->clist = clist;
    	cout << "Création de l'objet Thread "<< endl;
    	Start();
    }
     
     
    Control :: ~Control(void)
    {
     
    }
     
    void Control::Start(void)
    {
            cout << "Démarrage du thread"<<": debut.\n";
            pthread_create(thread,NULL,&Control::Run,(void *)&clist);
            cout << "Démarrage du thread"<< ": fait.\n";
    } 
     
    void Control::Join(void)
    {
            pthread_join(*thread,NULL);
    }
     
    void * Control::Run(void * clist)
    {
           int i=0;
           Chlist *m_ctrl= (Chlist*)clist;
           m_ctrl->printAll();
           while(1)
           {
                  i++;
                  cout << " execution n°" << i << endl;
                  sleep(1);
           }
           return NULL;
    }
    voici le point h:
    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
     
    #ifndef __CONTROL_H__
    #define __CONTROL_H__
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
     
    extern "C"
    {
    	#include <unistd.h>
    	#include <stdio.h>
    	#include <stdlib.h>
    	#include <sys/socket.h>
    	#include <sys/types.h>
    	#include <sys/stat.h>
            #include <fcntl.h>
            #include <dirent.h>
            #include <pthread.h>
    }
    #include <pthread.h>
    #ifndef BUFFER_SIZE
    #define BUFFER_SIZE 1024
    #endif
     
    using namespace std;
     
     
    class Control
    {
    	public:
    	   Control (Chlist * clist);
    	   ~Control (void);
    	   void Start(void);
    	   void Join(void);
    	   static void *Run(void * clist);
     
        private:
    	  pthread_t * thread;
    	  pthread_attr_t * attr;
    	  Chlist * clist;
     
    };
     
    #endif
    voici mon erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cc1plus: warnings being treated as errors
    Control.cpp: In constructor ‘Control::Control(Chlist*)’:
    Control.cpp:7: error: declaration of ‘clist’ shadows a member of 'this'
    make: *** [Control.o] Erreur 1
    Merci de votre compréhension.

  2. #2
    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
    this-> ?

    1. Supprime dans ton cpp le constructeur
    2. Dans le header,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Control
    {
    	public:
    	   Control (Chlist * clistarg) :
    	   	   clist(clistarg)
    	   	   {};
    	   void Init();
    };
    3. A nouveau dans le cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Control::Init()
    {
    	   Start();
    }

    Le probleme est simple, tu essayes d'acceder aux membres de ta classe avec this-> alors que c'est inutile ()
    Suffit simplement de la meme facon que tu accedes a la fonction membre void Start(); d'écrire Start(); clist = X; etc.

  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
    Bonjour,

    Ton paramètre du constructeur s'apelle clist et... une variable membre s'apelle clist.
    Inutile d'aller plus loin pour se rendre compte de l'erreur.
    En théorie, il me semblait que le this->clist = clist; permettait de réaliser cette opération.
    En pratique, ne jamais avoir de paramètre avec le même nom qu'un membre. C'est évident : comment savoir si tu veux utiliser le paramètre ou le membre ?!

    Enfin, il est mieux d'utiliser les listes d'initialisation pour le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Control::Control(Chlist* _clist) : clist(_clist)
    {
    	cout << "Création de l'objet Thread "<< endl;
    	Start();
    }
    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
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par l'unique Voir le message
    voici mon erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cc1plus: warnings being treated as errors
    Control.cpp: In constructor ‘Control::Control(Chlist*)’:
    Control.cpp:7: error: declaration of ‘clist’ shadows a member of 'this'
    make: *** [Control.o] Erreur 1
    En fait, ce n'est pas exactement une erreur, mais un avertissement, que ton compilateur "promeut" en erreur ("cc1plus: warnings being treated as errors"). Tu dois avoir un paramètre de compilation qui fait cela.

    Comme d'autres l'ont dit, l'avertissement porte sur le fait que tu passes au constructeur un paramètre qui a le même nom qu'un de ses membres. Ce n'est pas incorrect, et ton code fonctionnera (this->clist et les règles du langage lèvent l'ambiguité), mais ça reste une pratique dangereuse: quand plusieurs choses différentes ont le même nom, une erreur est vite arrivée.

    C'est pour cela que le compilateur émet un avertissement.

    Francois

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    bonjour, j'ai modifié le code , il compile bien, cependant il me fait une erreur de segmentation au niveau du pthread_create(), j'ai utilisé gdb pour connaître où se situe l'erreur. Cela me paraît aussi blizzard puisque si j'aurais mis les mauvais arguments dans pthread_create(), j'aurais une erreur de compilation, et ce n'est pas le cas. Pouvez vous m'expliquer pourquoi j'ai cette erreur de segmentation?

    Voici le nouveau code cpp:
    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
     
    #include "Interpretor.h"
    #include "Control.h"
     
    using namespace std;
     
     
    Control::Control(Chlist* _clist) : clist(_clist)
    {
    	cout << "Création de l'objet Thread "<< endl;
    	Init();
    }
     
    Control :: ~Control(void)
    {
    }
     
    void Control::Init()
    {
    	   Start();
    }
    void Control::Start(void)
    {
    	cout << "Démarrage du thread"<<": debut.\n";
    	pthread_create(thread,NULL,&Control::Run,(void *)clist);
    	cout << "Démarrage du thread"<< ": fait.\n";
    } 
     
    void Control::Join(void)
    {
    	pthread_join(*thread,NULL);
    }
     
    void * Control::Run(void * clist)
    {
    	int i=0;
    	Chlist *m_ctrl= (Chlist*)clist;
    	m_ctrl = NULL;
    	while(1)
    	{
    		i++;
    		cout << " execution n°" << i << endl;
    		sleep(1);
    	}
    	return NULL;
    }
    Voici le nouveau point h :
    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
     
    #ifndef __CONTROL_H__
    #define __CONTROL_H__
     
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
     
    extern "C"
    {
    	#include <unistd.h>
    	#include <stdio.h>
    	#include <stdlib.h>
    	#include <sys/socket.h>
    	#include <sys/types.h>
    	#include <sys/stat.h>
            #include <fcntl.h>
            #include <dirent.h>
    	#include <pthread.h>
    }
    #include <pthread.h>
    #ifndef BUFFER_SIZE
    #define BUFFER_SIZE 1024
    #endif
     
    using namespace std;
     
     
    class Control
    {
    	public:
     
    		Control(Chlist* _clist);
    		~Control (void);
    		void Init();
    		void Start(void);
    		void Join(void);
    		static void *Run(void * clist);
     
        private:
    	  pthread_t * thread;
    	  pthread_attr_t * attr;
    	  Chlist * clist;
     
    };
     
    #endif
    Voici ce que me dit gdb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Program received signal SIGSEGV, Segmentation fault.
    0x00135454 in __pthread_create_2_1 (newthread=0x0, attr=0x0, start_routine=0x804a650 <Control::Run(void*)>, 
        arg=0x8059170) at pthread_create.c:558
    558     pthread_create.c: Aucun fichier ou dossier de ce type.
            in pthread_create.c
    (gdb) bt
    #0  0x00135454 in __pthread_create_2_1 (newthread=0x0, attr=0x0, 
        start_routine=0x804a650 <Control::Run(void*)>, arg=0x8059170) at pthread_create.c:558
    #1  0x0804a753 in Control::Start (this=0x8059210) at Control.cpp:25
    #2  0x0804e76b in Interpretor::Interpretor (this=0x8059180, clist=0x8059170) at Interpretor.cpp:34
    #3  0x08054229 in Site::Site (this=0x8059028, filename=..., p_port=10000) at site.cpp:24
    #4  0x080528cb in main (argc=3, argv=0xbffff324) at main.cpp:45
    Merci de votre compréhension.

  6. #6
    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
    Où est initialisé thread ?
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    bonjour, pour pouvoir utiliser mon thread je l'ait déclarer dans le .h comme cela: "pthread_t * thread;", une fois que mon thread est déclaré, il est lié à une fonction avec "pthread_create()".J'ai vu des exemples qui font comme cela.
    Je ne sais pas si ma façon de faire est correcte?

    Voici comment j'ai fais dans le .cpp:
    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
     
    Control::Control(Chlist* _clist) : clist(_clist)
    {
    	cout << "Création de l'objet Thread "<< endl;
    	Init();
    }
     
    Control :: ~Control(void)
    {
    }
     
    void Control::Init()
    {
    	   Start();
    }
    void Control::Start(void)
    {
    	cout << "Démarrage du thread"<<": debut.\n";
    	pthread_create(thread,NULL,&Control::Run,(void *)clist);
    	cout << "Démarrage du thread"<< ": fait.\n";
    }
    Dois je initialisé le thread et où et comment?

  8. #8
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    je ne sais pas ce que fait pthread_create, mais définir un pointeur sans l'initialiser est une erreur. Cela dépend de ce que fait pthread_create, mais tu devrais mettre dans ton constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Control::Control(Chlist* _clist) : 
    clist(_clist),
    //thread(null)
    //ou
    //thread( new thread() )
    {
    	cout << "Création de l'objet Thread "<< endl;
    	Init();
    }

    Mais je penses que Bousk pourra t'aiguiller mieux que moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/06/2011, 08h28
  2. Réponses: 1
    Dernier message: 16/06/2008, 10h38
  3. Réponses: 1
    Dernier message: 09/06/2006, 17h06
  4. [EasyPHP] Warning: Sablotron error on line 41: wrong expression syntax
    Par moonia dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 27/03/2006, 14h00
  5. Réponses: 12
    Dernier message: 26/01/2006, 14h51

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