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 :

Erreur : expected constructor, destructor, or type conversion before �;� token


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par d�faut Erreur : expected constructor, destructor, or type conversion before �;� token
    Bonjour

    J'ai l'erreur expected constructor, destructor, or type conversion before �;� token mais je n'arrive pas � comprendre ou est mon erreur.
    Pouvez vous m'aider ?

    Cela doit tourner autour de l'usage d'une fonction statique d'une de mes classes.
    Voici le code (je pr�cise que je travaille sur un Arduino) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <Wire.h>
    #include <servoSD20.h>
     
    servoSD20::begin();         // Nb : L'erreur est ici à priori !!
     
    servoSD20 aiguillage(1, 10, 90);
     
    void setup()
    {};
     
    void loop()
    {};
    Classe servoSD20
    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
     
     
    /**
     * servoSD20.h
     */
     
    #ifndef SERVOSD20_H
    #define SERVOSD20_H
     
    #include <Arduino.h>
    #include <Wire.h>
     
    class servoSD20
    {
     
    	public :
     
    		servoSD20(const uint8_t id, const uint8_t leftPosition, const uint8_t rightPosition);
    		void switchLeft();
    		void switchRight();
    		void switchPosition();
    		inline bool isRight() { return servoSD20::ms_positionsRegister & _BV(m_id); };
     
    		void findPosition(const uint8_t fromPosition, const uint8_t toPosition, const uint8_t increment, const uint8_t waitingTime);
    		inline void gotoPosition(const uint8_t position);
     
    		inline static void begin();
    		inline static uint32_t getPositionsRegister() { return servoSD20::ms_positionsRegister; };
    		inline static bool getMoved() { return servoSD20::ms_moved; };
     
    		static uint32_t ms_positionsRegister;
    		static bool ms_moved;
     
    	private :
     
    		uint8_t m_id;
    		uint8_t m_leftPosition;
    		uint8_t m_rightPosition;	
     
    };
     
    #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
    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
     
     
     
    /**
     * servoSD20.cpp
     */
     
    #include <servoSD20.h>
     
    #define SD20_I2C_ADRESS 0xC2
    #define MOVEMENT_DELAY 60
     
    /**
     * Constructor
     */
    servoSD20::servoSD20(const uint8_t id, const uint8_t leftPosition, const uint8_t rightPosition)
    	: m_id(id), m_leftPosition(leftPosition), m_rightPosition(rightPosition)
    {
    	Wire.begin();
    	switchRight();
    };
     
     
    /**
     * Switch to right position
     */
    void servoSD20::switchRight()
    {
    	if(!isRight())
    	{
    		gotoPosition(m_rightPosition);
    		servoSD20::ms_positionsRegister |= _BV(m_id);
    		servoSD20::ms_moved = true;
    	}
    };
     
    /**
     * Switch to left position
     */
    void servoSD20::switchLeft()
    {
    	if(isRight())
    	{
    		gotoPosition(m_leftPosition);
    		servoSD20::ms_positionsRegister &= ~_BV(m_id);
    		servoSD20::ms_moved = true;
    	}
    };
     
     
    /**
     * Switch positions : Left to right or right to left
     */
    void servoSD20::switchPosition()
    {
    	if(isRight())
    	{
    		switchLeft();
    	} else {
    		switchRight();
    	}
    };
     
    /**
     * Init Wire/SD20 & static members
     */
    void servoSD20::begin() 
    { 
    	Wire.begin();
    	servoSD20::ms_positionsRegister = 0;
    	servoSD20::ms_moved = false;
    };
     
    /**
     * Go to the specified position
     */
    void servoSD20::gotoPosition(const uint8_t position)
    {
    	Wire.beginTransmission(SD20_I2C_ADRESS);
    	Wire.write(m_id);
    	Wire.write(position);
    	Wire.endTransmission();
    	delayMicroseconds(MOVEMENT_DELAY);
    };
     
    /**
     * Finding position
     */
    void servoSD20::findPosition(uint8_t fromPosition, uint8_t toPosition, const uint8_t increment, const uint8_t waitingTime)
    {
    	uint8_t ptr;
     
    	if(fromPosition > toPosition)
    	{
    			ptr = fromPosition; 
    			fromPosition = toPosition;
    			toPosition = ptr;
    	}
     
    	Serial.println("Finding position : Start");
    	for(uint8_t ptr = fromPosition; ptr <= toPosition; ptr += increment)
    	{
    		Serial.print("   Pos:");
    		Serial.println(ptr);
    		gotoPosition(ptr);
    		delay(waitingTime);
    	}
    	Serial.println("Finding position : Stop");
    };

    Merci

  2. #2
    Membre Expert
    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
    Par d�faut
    Hello,

    T'aurais pas oubli� une fonction main par hazard ? ^^
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <servoSD20.h>
     
    void setup()
    {};
     
    void loop()
    {};
     
    int main() {
       servoSD20::begin();
       servoSD20 aiguillage(1, 10, 90);
       return 0;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par d�faut Erreur : expected constructor, destructor, or type conversion before �;� token
    Hello

    Ici je ne pense pas, car je suis sur un Arduino (micro controleur).
    Sur ce mat�riel, on n'a pas de main(), mais 2 fonctions :
    - Une setup()
    - Une loop() qui tourne en boucle.

    Cependant je commence � comprendre : Je ne dois pas pouvoir ex�cuter une fct statique de classe en dehors d'une autre fonction (setup(), loop() ou un main() ...)
    La seule chose qui puisse s'ex�cuter en dehors d'une fonction, ce sont les constructeurs d'objet.

    Moi je veux pouvoir ex�cuter une fonction statique de la classe servoSD20 avant d'instancier les objets de cette classe, afin d'initialiser des membres statiques de celle-ci. Et comme je dois instancier mes objets servosSD20 avant setup() et loop() ... je suis xxxxx !

    cela pourrait il �tre cela ?

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Lu'

    Je n'ai pas l'impression que Wire.begin() soit utile dans la m�thode ServoSD20::begin(), elle est d�j� utilis�e dans le constructeur. Quant � l'initialisation de variables statiques, elles peuvent se faire directement dans le .h si celles-ci sont constantes static const int n = 123; ou dans le cpp si une initialisation directe est possible (sans variable interm�diaire).
    D'ailleurs, est-ce vraiment int�ressant de les mettre en statique ? Je ne crois pas.

    Sinon, 3 m�thodes pour initialiser des variables statiques:
    - ajouter dans la classe un bool�en qui permet d'appeler les statiques au premier appel du constructeur
    - initialiser une variable statique avec un retour de fonction
    - instancier un objet qui ne fait que l'initialisation des statiques dans sont constructeur

    Je pr�f�r� la derni�re, mais le plus simple est de ne pas avoir de variables statiques.

  5. #5
    Membre Expert
    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
    Par d�faut
    Bah du coup tu as une fonction main qui ressemble surement � �a
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    int main() {
       setup();
       while(1) {
          loop();
       }
       return 0;
    }
    Utilise la fonction setup pour cr�er tes objets etc, c'est son r�le.
    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
    #include <servoSD20.h>
     
    class servoSD20 {
       // ...
       servoSD20& beginAndCreate(int a, int b, int c) {
           begin();
           static servoSD20 obj(a, b, c);
           return obj;
        }
    };
     
    // ne pas delete, l'objet est alloué sur la pile ;)
    servoSD20 *aiguillage; // s'mal les objets globaux, mais j’avoue que je vois pas comme l'éviter...
     
    void setup() {
       aiguillage = &servoSD20::beginAndCreate(1, 10, 90);
    }
     
    void loop() { }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Par d�faut
    Bonjour

    merci pour vos reponses

    -je vais voir si je peux retirer le Wire.begin() de ma fct statique qui pose probleme et initialiser mes membres statiques dans mon cpp

    -les membres statiques sont necessaires : manipul�s par tous les instances de ma classe, ils vont me donner ailleurs dans le code des infos de synthese sur ceux ci. (J'aurai besion de 20 instances de servoSD20 (ce sont des servos moteurs pour un robot))

    - instancier mes objets servoSD20 dans le setup() : je vais avoir des problemes de port�e. Mes objets ne seront pas visibles dans ma fct loop() l� o� ils vont etre manipul�s.

    A suivre...

Discussions similaires

  1. R�ponses: 4
    Dernier message: 17/11/2013, 11h03
  2. erreur: expected type-specifier before
    Par julie_n3k0 dans le forum C++
    R�ponses: 4
    Dernier message: 30/08/2009, 15h49
  3. erreur: expected class-name before �{"
    Par mansour67 dans le forum wxWidgets
    R�ponses: 7
    Dernier message: 08/04/2008, 18h57
  4. R�ponses: 5
    Dernier message: 13/03/2006, 15h51

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