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 :

Initialisation Variable Statique


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut Initialisation Variable Statique
    Bonjour,

    J'ai deux classes : TTimer et pedal dont voici les headers:

    template_timer.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
    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
    108
    109
    110
    111
    112
    113
    #pragma once
    #include <atlbase.h>
     
    static void CALLBACK TimerProc(void*, BOOLEAN);
     
    // **********************************************************
    // * class CTimer 											*
    // **********************************************************
    class CTimer
    {
    public:
        CTimer()
        {
            m_hTimer = NULL;
            m_mutexCount = 0;
        }
     
        virtual ~CTimer()
        {
            Stop();
        }
     
        bool Start(unsigned int interval,   // interval in ms
                   bool immediately = false,// true to call first event immediately
                   bool once = false)       // true to call timed event only once
        {
            if( m_hTimer )
            {
                return false;
            }
     
            SetCount(0);
     
            BOOL success = CreateTimerQueueTimer( &m_hTimer,
                                                  NULL,
                                                  TimerProc,
                                                  this,
                                                  immediately ? 0 : interval,
                                                  once ? 0 : interval,
                                                  WT_EXECUTEINTIMERTHREAD);
     
            return( success != 0 );
        }
     
        void Stop()
        {
            DeleteTimerQueueTimer( NULL, m_hTimer, NULL );
            m_hTimer = NULL ;
        }
     
        virtual void OnTimedEvent()
        {
            // Override in derived class
        }
     
        void SetCount(int value)
        {
            InterlockedExchange( &m_mutexCount, value );
        }
     
        int GetCount()
        {
            return InterlockedExchangeAdd( &m_mutexCount, 0 );
        }
     
    private:
        HANDLE m_hTimer;
        long m_mutexCount;
    };
     
    // **********************************************************
    // * TimerProc    											*
    // **********************************************************
    void CALLBACK TimerProc(void* param, BOOLEAN timerCalled)
    {
        CTimer* timer = static_cast<CTimer*>(param);
        timer->SetCount( timer->GetCount()+1 );
        timer->OnTimedEvent();
    };
     
    // **********************************************************
    // * template class TTimer									*
    // **********************************************************
    template <class T> class TTimer : public CTimer
    {
    public:
        typedef private void (T::*TimedFunction)(void);
     
        TTimer()
        {
            m_pTimedFunction = NULL;
            m_pClass = NULL;
        }
     
        void SetTimedEvent(T *pClass, TimedFunction pFunc)
        {
            m_pClass         = pClass;
            m_pTimedFunction = pFunc;
        }
     
    protected:
        void OnTimedEvent()  
        {
            if (m_pTimedFunction && m_pClass)
            {
                (m_pClass->*m_pTimedFunction)();
            }
        }
     
    private:
        T *m_pClass;
        TimedFunction m_pTimedFunction;
    };


    pedal.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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #pragma once
     
    #include <string>
     
    #include "toolbox.h"
    #include "template_timer.h"
    #include "const_pedal.h"
    #include "tserial_event.h"
    #include "enumser.h"
     
    class pedal
    {
    public:
     
    	void													enumerate(void);
    	void													activate(void);
    	bool													search_pedal_port(void);
    	void													deactivate(void);
     
    	static char*											reply_iss_version;
    	static char*											reply_serial_number;
    	static char*											reply_configuration;
    	static char*											reply_io_state;
     
    	// state comes with UP or DOWN
    	static bool												pedal_state;
     
     
    private:
     
    	void                                                    wait_for_reply(void);
    	void													OnTimedEvent_PedalReply(void);
    	void													OnTimedEvent_PedalRequest(void);
    	void													OnTimedEvent_PedalEnumeration(void);
    	// the callback function has to be a static one if any class member !
    	static void												SerialEventManager(uint32 object, uint32 event);
    	static void												OnDataArrival(int size, char *buffer);
    	static void												todo_on_pedalchange(void);
    	void													request_iss_version(void);
    	void													request_pedal_state(void);
    	void													request_serial_number(void);
    	void													configure_io_mode(void);
     
     
    	TTimer<pedal>											timer_pedal_request;
    	static TTimer<pedal>									timer_pedal_reply;
    	TTimer<pedal>											timer_pedal_enumeration;
     
    	static char*											serial_number;
    	static std::string 										firmware_revision_number;
    	// status comes with OK or not 
    	static bool												pedal_status;
     
    	static bool												iss_version_received;	
    	static bool												io_mode_received;
    	static bool												pedal_state_received;
    	static bool												pedal_state_mem;
    	static bool												first_pedalrequest;
    	bool													pedalreply_timeelapsed;
     
     
    };
    La variable timer_pedal_reply est statique car utilisée dans un callback.
    Je ne vois pas comment l'initialiser pour que celà passe à l'édition de lien.


    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    dans le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool pedal::pedal_state = 0;
    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.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Je ne parle pas de pedal_state mais de timer_pedal_reply ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par mulfycrowh Voir le message
    template_timer.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    // **********************************************************
    // * template class TTimer									*
    // **********************************************************
    template <class T> class TTimer : public CTimer
    {
    public:
        typedef private void (T::*TimedFunction)(void);
    ...
    Hello,

    ton typedef est chelou, jamais vu un typedef avec un private dedans (compile pas sous gcc 4.8 en tout cas), de plus le "T::" je vois pas trop comment l'interpréter (j'ai toujours eu de mal avec la syntaxe des pointeurs sur fonctions.)

    Mais en le remplaçant par :
    typedef void (*TimedFunction)(void);

    J'ai pas de problèmes de link, un simple
    TTimer<pedal> pedal::timer_pedal_reply;
    dans pedal.cpp, comme pour tout membre static suffit.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    salut;
    Citation Envoyé par Iradrille Voir le message
    de plus le "T::" je vois pas trop comment l'interpréter (j'ai toujours eu de mal avec la syntaxe des pointeurs sur fonctions.)
    En fait, typedef void (T::*TimedFunction)(void);indique que l'on aura un pointeur sur une fonction membre de T qui sera connue comme ne prenant aucun argument et ne renvoyant aucune valeur sous le nom de TimedFunction

    C'est presque comme les pointeurs de fonctions "classiques" si ce n'est que c'est pour les fonctions membes de classe, car les uns (les pointeurs de fonctions classiques) ne peuvent pas être utilisés les autres (les pointeurs de fonctions membres) ni inversement

    Ceci dit, en beau C++, on préférerais sans doute utiliser un fonctieur, voir, si on dispose de C++ de la fantastique class function, disponible (comme tout ce qui est fournit en standard) dans l'espace de noms std par inclusion de <functionnal>
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par mulfycrowh Voir le message
    Je ne parle pas de pedal_state mais de timer_pedal_reply ...
    Exactement de la même manière puisque timer_pedal_reply n'est pas template.

    Il est de toutes façons déjà initialisé avec le constructeur par défaut.
    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 du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Lorsque j'initialise à 0, j'obtiens naturellement cette erreur de compil :

    error C2440: 'initializing' : cannot convert from 'int' to 'TTimer<T>'

    Ce n'est donc pas la solution.
    Il est nécessaire d'initialiser la variable car elle est statique sinin ne passe pas à l'édition de lien

  8. #8
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ta variable est un TTimer<pedal> dont effectivement si tu essayes de l'initialiser avec une affectation d'un int, c'est une double erreur.
    L'initialisation d'un objet c'est via le constructeur.
    Et static ou pas, un objet a toujours un appel à son constructeur par défaut qui est fait. L'initialisation n'est nécessaire que si
    - tu veux utiliser un constructeur avec des paramètres (autres que les paramètres par défaut).
    - ne possède pas de constructeur par défaut (par extension au premier point)
    Ton problème à l'édition des liens n'est en rien lié au statut static de la variable.
    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.

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Lorsque la variable n'est pas static le programme compile très bien.
    Lorque je la déclare en static la compil donne :

    1>pedal.obj : error LNK2001: unresolved external symbol "private: static class TTimer<class pedal> pedal::timer_pedal_reply" (?timer_pedal_reply@pedal@@0V?$TTimer@Vpedal@@@@A)
    1>E:\C & M Project\Project.exe : fatal error LNK1120: 1 unresolved externals

  10. #10
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu l’as rajoutée dans le .cpp comme te l’a suggéré Bousk ?

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    Oui tout à fait.
    Je pense que je vais rendre la méthode call back non static

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut
    J'ai réussi à passer le callback en non static en utilisant une fonction wrapper et un pointeur local sur la classe.
    Je peux donc utiliser ce pointeur pour appeler mes méthodes et mes attributs qui n'ont plus besoin d'être static.

Discussions similaires

  1. Réponses: 16
    Dernier message: 09/08/2010, 11h14
  2. [PHP 5.0] Initialisation d'une variable statique
    Par Rolf-IV dans le forum Langage
    Réponses: 7
    Dernier message: 19/03/2009, 11h04
  3. Réponses: 1
    Dernier message: 14/04/2008, 14h53
  4. Exportation de variable statique
    Par Laurent Gomila dans le forum C++
    Réponses: 16
    Dernier message: 31/08/2005, 16h32
  5. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30

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