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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Points : 30
    Points
    30
    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
    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
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Points : 30
    Points
    30
    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
    739
    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 : 739
    Points : 3 627
    Points
    3 627
    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
    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
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Points : 30
    Points
    30
    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