1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 116
    Points : 46
    Points
    46

    Par défaut probleme avec une sorte de thread

    Bonjour,

    voila je suis en premiere année de dut informatique, et je coince. Je fais partie d'un club robotique et un enseignant à programmer un µC qui me permet d'utiliser des classes déja toutes faites. Celle qui me pose probleme et la classe Ticker voici la méthode en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /** Attach a function to be called by the Ticker, specifiying the interval in micro-seconds
         *
         *  @param fptr pointer to the function to be called
         *  @param t the time between calls in micro-seconds
         */
        void attach_us(void (*fptr)(void), timestamp_t t) {
            _function.attach(fptr);
            setup(t);
        }
    j'ai donc réussi a utiliser cette méthode :
    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
     
    /... différents objets et variables créent en global
     
    void CapteurUs(){ //cette fonction permet de générer un pulse pour que mon capteur Ultrason fonctionne, le code en lui meme n'est pas intéressant 
    	if(m_verrou_trig == false){
    		Timer_trig.start();
    		Pin_trig.write(1);
    		m_verrou_trig  = true;
    	}
    	if((Timer_trig.read_us() >= 10) and (Timer_trig.read_us() < 60)){
    		Pin_trig.write(0);
    	}
    	if(Timer_trig.read_us() >= 1000){ 	//on relance automatiquement une autre impulsion apres 1000µs 
     
    		Timer_trig.stop();
    		Timer_trig.reset();
    		m_verrou_trig2  = false;
    	}
    }
    int main(){
    Ticker T1;
    T1.attach_us(&CapteurUs1, 25);
    //...suite du code
    et ca marche. Mais vu que j'ai plein de capteurs Ultrason à utiliser, branchés à des broches différentes, je me suis dis, autant faire une classe ca sera plus clair. Et la je coince. Car ma class CapteurUS j'ai une méthode generatePulse() et quand je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CapteurUS C1(...); //constructeur avec différents parametres
     
    Ticker T1;
    T1.attach_us(&C1.generetePulse, 25)
    ca ne marche pas. Je me suis renseigné et il faut mettre ca en static, or le probleme et qu'en static je n'ai plus acces au variable de ma class donc je suis coincé car ma class Capteur doit modifier la distance de l'un de ses attributs.

    Comment faire? j'espere que vous avez compris mon probleme.
    Je suis débutant en C++ donc ne soyez pas bourrin dans vos explications sinon vous allez me perdre :'(

    Merci d'avance pour vos réponses

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 528
    Points : 2 719
    Points
    2 719

    Par défaut

    Bonjour,

    La fonction attach_us() attend un pointeur de fonction, en C++ on préfère utiliser les foncteurs qui pourraient directement gérer un std::bind() ou un lambda
    On ferait alors T1.attach_us( [&C1](){ return C1.generetePulse(); }, 25 );. Mais cela nécessite de remplacer toutes les déclarations void (*fptr)(void) par std::function<void()> fptr dans la classe Ticker.

    Sinon il faut faire une fonction "relai"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CapteurUS *glbC1 = nullptr;
    void generatePulseC1() {
       glbC1->generatePulse();
    }
    glbC1 = &C1;
    T1.attach_us( &generatePulseC1, 25 );
    C'est pas top du tout cette variable globale, mais sinon comment s'insérer dans un truc qui attend une fonction sans paramètre quand on a un objet et une fonction à transmettre. C'est pourquoi en C on prévoit toujours un paramètre supplémentaire pour apporter un contexte et en C++ on utilise à la place les foncteurs qui sont des fonctions qui peuvent porter un contexte.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 116
    Points : 46
    Points
    46

    Par défaut

    ca marche !!

    merci beaucoup !
    Je vais me renseigner sur les foncteurs car ca a l'air important

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 116
    Points : 46
    Points
    46

    Par défaut

    Une derniere petite question, pourquoi mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T1.attach_us( &generatePulseC1, 25 );
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T1.attach_us( &generatePulseC1(), 25 );
    Normalement la fonction s'appelle generatePulseC1(), donc pourquoi retirer les parenthèses.

  5. #5
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 280
    Points : 9 373
    Points
    9 373

    Par défaut

    Normalement la fonction s'appelle generatePulseC1(), donc pourquoi retirer les parenthèses.
    Non, elle ne "s'appelle" pas "generatePulseC1()", elle s'appelle "generatePulseC1" (ou "imp_generatePulseC1@SDFQDS?dsfqsqsf@sfsdfqs" si c'est une fonction C++ et non C et tous les caractères "à la con" sont fonction du compilateur).

    Quand on définit une fonction, on donne son "nom" ET signature ET son type de retour.
    Dans :
    "void", c'est le type de retour.
    "generatePulseC1", c'est le nom (non décoré) de la fonction.
    "()", c'est sa signature.

    En écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T1.attach_us( &generatePulseC1(), 25 );
    http://fr.cppreference.com/w/cpp/lan...tor_precedence
    Tu demandes d'appeler la méthode "generatePulseC1" (ou d'appeler l'opérateur "()" si "generatePulseC1" aurait été un objet et non une fonction), et de prendre l'adresse de la valeur de retour (adresse d'un "void", ça coince) comme premier paramètre de la fonction attach_us.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 116
    Points : 46
    Points
    46

    Par défaut

    ok j'ai compris, merci d'avoir pris le temps de tout m'expliquer

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

Discussions similaires

  1. thread (probleme avec une tour lego USB)
    Par JuuL.LapinouX dans le forum POSIX
    Réponses: 9
    Dernier message: 01/08/2006, 10h05
  2. [C#] [Oracle] Probleme avec une procedure stockée
    Par sronin1 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/05/2004, 19h04
  3. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24
  4. au secour probleme avec une requete...
    Par soufiane59 dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 26/09/2003, 10h28
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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