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 :

Changement de pointer d'une variable et de fonctions


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut Changement de pointer d'une variable et de fonctions
    Bonjour,

    J'ai 2 class "identique" et je souhaiterais pouvoir acc�der � l'une ou l'autre via un pointer pour avoir un code g�n�rique

    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
     
    class Class1 {
     public :
      uint8_t Var1;
      uint8_t Var2[20];
     
     void Class1();
      bool Func1(); //fait une action a
      bool Func2(); //fait une action b
    }
     
    class Class2 {
     public :
      uint8_t Var1;
      uint8_t Var2[20];
     
      void Class2();  
      bool Func1();  //fait une action c
      bool Func2();  //fait une action d
    }
    Dans l'id�e, j'aurais voulu faire comme suit mais cela ne peut pas fonctionner (ou alors je n'ai pas trouv� comment) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    Class1 test[0] = Class1();
    Class2 test[1] = Class2();
    Je me suis r�orient� sur une class "contenaire" qui fait le job � la place :

    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
     
    class Class_global() {
     public:
      uint8_t Var_global_1;
      uint8_t Var_global_2[20];
      bool (Class1::*Func_global_1())();
     
      void Class_global() {
       Class1 toto = Class1();
       *Var_global_1 = &toto.Var1; //renvoit "invalid type argument of unary '*' (have 'uint8_t {aka unsigned char}')"
       *Var_global_2 = &toto.Var2; //warning: invalid conversion from 'uint8_t (*)[40] {aka unsigned char (*)[40]}' to 'uint8_t {aka unsigned char}'
       Func_global_1 = &toto.Func1; //renvoit "warning: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say '&Class1::Func1' [-fpermissive]" 
     
     
      }
    }
    Normalement j'aurais du d�clar� "uint8_t *Var_global_1"; n�anmoins j'ai peur ensuite de faire des erreurs en oubliant d'appeler "&Var_global_1" plut�t que "Var_global_1". En faite je pensais que je pouvais modifier la valeur de l'address, mais � priori cela bloque et je ne comprends pas vraiment pourquoi.

    Je ne sais pas si je suis tr�s clair

    En pratique, n'importe quelle autre solution me convient, l'objectif est de pouvoir acc�der de mani�re indiff�renci� � Class1 ou Class2 de mani�re g�n�rique, mais je s�che un peu.

    Merci d'avance,

  2. #2
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    Citation Envoy� par _Froggy_ Voir le message
    En pratique, n'importe quelle autre solution me convient, l'objectif est de pouvoir acc�der de mani�re indiff�renci� � Class1 ou Class2 de mani�re g�n�rique.
    Peut-�tre en utilisant l'h�ritage ?

    PS : Tu as du te tromper de forum ? Ici c'est le forum C, ton code ressemble � du C++, � moins que ce soit une sorte de C with class .
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  3. #3
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut
    Citation Envoy� par CGi Voir le message
    Peut-�tre en utilisant l'h�ritage ?

    PS : Tu as du te tromper de forum ? Ici c'est le forum C, ton code ressemble � du C++, � moins que ce soit une sorte de C with class .
    C'est de l'"arduino", je ne sais pas si je peux le d�placer sur le forum C++. C'est plus une probl�matique de pointeur � mon sens que de class, mais pourquoi, je vais voir si je trouve un mod�rateur pour d�placer le message

    J'ai regard� l'h�ritage, de ce que je comprends, mon probl�me reste entier � savoir un nom de variable unique pour 2 types.

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    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 : 1 599
    Par d�faut
    Je suppose que ton code est plut�t du C++, je fait une r�ponse en ce sens.

    Suivant ton besoin exact, il existe plein de mani�re de faire ce que tu souhaites. Peut-�tre qu'un exemple concret d'utilisation nous permettrait de mieux te r�pondre.

    La mani�re intuitive serait d'utiliser l'h�ritage, �a donne:
    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
    class Base {
     public :
       uint8_t Var1;
       uint8_t Var2[20];
     
       virtual bool Func1() = 0 ; // action à définir dans la dérivée
       virtual bool Func2() = 0;  // action à définir dans la dérivée
       ~Base() = default;
    };
    class Class1 : public Base {
     public :
       bool Func1() override; //fait une action a
       bool Func2() override; //fait une action b
    };
    class Class2 : public Base {
     public :
       bool Func1() override; //fait une action c
       bool Func2() override; //fait une action d
    };
    Tu peux alors utiliser la type Base pour repr�senter Class1 ou Class2. Attention �a n'a de sens que si la Base est utilis�e via pointeur ou r�f�rence.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <array>
     
    int  main() {
       Class1  class1;
       Class2  class2;
       std::array<Base*,2>  tabp{ &class1, &class2 };   // tableau de 2 pointeurs sur des Class1 ou des Class2
     
       for ( auto*  pclasse  :  tabp ) {   // va faire class1.a class2.c class1.b class2.d
          pclasse->Func1();
          pclasse->Func2();
       }
    }
    Mais il y d'autre mani�res sans l'h�ritage, on peut avoir une classe qui repr�sente une Class1 ou une Class2, mais peut-�tre que ce code n'est pas possible sur Arduino:
    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
    #include <variant>
    #include <array>
     
    class Class1ouClass2 {
       std::variant<Class1,Class2>  cl1_ou_cl2;
    public:
        Class1ouClass2( std::variant<Class1,Class2> classe ) : cl1_ou_cl2{std::move(classe)} {}
        // on devrait plutôt passer par la fonction-template std::visit(), mais l'opérateur conditionnel est plus lisible pour débuter
        bool  Func1() { return  (cl1_ou_cl2.index()==0) ? std::get<0>(cl1_ou_cl2).Func1() : std::get<1>(cl1_ou_cl2).Func1();  }
        bool  Func2() { return  (cl1_ou_cl2.index()==0) ? std::get<0>(cl1_ou_cl2).Func2() : std::get<1>(cl1_ou_cl2).Func2();  }
    };
     
    int  main() {
       Class1  class1;
       Class2  class2;
       std::array<Class1ouClass2,2>  tab{ Class1ouClass2{class1}, Class1ouClass2{class2} };   // tableau de 2 représentants de Class1 ou de Class2
     
       for ( auto&   classe  :  tab ) {   // va faire class1.a class2.c class1.b class2.d
          classe.Func1();
          classe.Func2();
       }
    }
    Il y aussi le proxy, ce que tu as essay� de faire en dernier y ressemble. C'est comme "Class1ouClass2" sauf que c'est un "ProxySurClass1ouClass2" qui au lieu de contenir une Class1 ou Class2, ne contient qu'une r�f�rence � un objet externe (Class1 ou Class2) et se fait passer pour lui.

    On peut aussi utiliser la m�taprogrammation avec un "duck typing" qui permet d'avoir un surco�t totalement nul. C'est plus complexe � mettre en place et peut-�tre impossible sur Arduino

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par d�faut
    Hello,

    Il y a un forum d�di� � arduino ici: https://www.developpez.net/forums/f2...arque/arduino/. Mais ton probl�me dans le cas pr�sent me semble plus �tre un probl�me de c++.

  6. #6
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Je suppose que ton code est plut�t du C++, je fait une r�ponse en ce sens.

    Suivant ton besoin exact, il existe plein de mani�re de faire ce que tu souhaites. Peut-�tre qu'un exemple concret d'utilisation nous permettrait de mieux te r�pondre.
    C'est de "l'arduino" voir du STM32, c'est � priori du C/C++ mais j'ai l'impression qu'il y a quelques diff�rences, j'ai eu des cas ou du code qui compile sous arduino, ne compile pas en C.
    C'est vrai que je n'ai pas donn� d'exemple, en l�occurrence j'ai plusieurs modules (par exemple des capteurs) qui ont les m�mes fonctionnalit�s de type "init()" "getData()". Actuellement, je parcours les modules avec des tests "if (module1) {module1.init(); module1.getData()}". Je voulais faire quelque chose de plus g�n�rique, ce qui me permettrait de rajouter autant de modules que je veux sans avoir � rajouter � chaque fois un test conditionnel.

    Merci pour tes r�ponses, je vais me pencher sur la litterature.
    Je pense que l'h�ritage sera effectivement le plus simple, j'aurais voulu conserver les class "exportables" (donc sans le public et utilisable comme tel) mais il y a un moment, c'est p�nible.
    J'ai un peu du mal � comprendre pourquoi une modification manuelle des adresses m�moires ne fonctionne pas. Sauf si j'ai zapp� quelque chose, en ASM cela passerait sans probl�me, les appels de fonctions sont les m�mes et les retours aussi.

    Citation Envoy� par edgarjacobs Voir le message
    Hello,

    Il y a un forum d�di� � arduino ici: https://www.developpez.net/forums/f2...arque/arduino/. Mais ton probl�me dans le cas pr�sent me semble plus �tre un probl�me de c++.
    Exact, mais en l'occurence c'est plus un probl�me de conception que d'arduino

  7. #7
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    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 : 1 599
    Par d�faut
    Citation Envoy� par _Froggy_ Voir le message
    C'est vrai que je n'ai pas donn� d'exemple, en l�occurrence j'ai plusieurs modules (par exemple des capteurs) qui ont les m�mes fonctionnalit�s de type "init()" "getData()". Actuellement, je parcours les modules avec des tests "if (module1) {module1.init(); module1.getData()}". Je voulais faire quelque chose de plus g�n�rique, ce qui me permettrait de rajouter autant de modules que je veux sans avoir � rajouter � chaque fois un test conditionnel.
    L'h�ritage est fait pour �a.
    Citation Envoy� par _Froggy_ Voir le message
    Je pense que l'h�ritage sera effectivement le plus simple, j'aurais voulu conserver les class "exportables" (donc sans le public et utilisable comme tel) mais il y a un moment, c'est p�nible.
    Je ne comprends pas en quoi le public est g�nant?? Ni ce que tu entends par "exportable"? ni la p�nibilit�!
    Citation Envoy� par _Froggy_ Voir le message
    J'ai un peu du mal � comprendre pourquoi une modification manuelle des adresses m�moires ne fonctionne pas. Sauf si j'ai zapp� quelque chose, en ASM cela passerait sans probl�me, les appels de fonctions sont les m�mes et les retours aussi.
    Je connais les assembleurs, le C et le C++. Je ne vois pas en quoi ils auraient un comportement diff�rent pour les adresses. Une adresse, c'est par d�finition immuable, et c'est r�f�ren�able; la seule diff�rence que je vois est:
    - en assembleur, une adresse est anonyme (donc complexe de suivre ce qui est point�)
    - en C, une adresse est typ�e. On connait le type qui est point�.
    - en C++, on a en juste en plus du typage du C, la notion de vie de l'objet.
    Peut-�tre souhaite-tu avoir un pointeur qui changerait de valeur pour pointer sur un autre type de donn�e?
    En C, �a serait un pointeur void. Mais �a donne un code ing�rable.
    En C++, on a d'autres possibilit�s (l'h�ritage permet cela � condition que les objets aient les m�me interfaces, ce qui semble �tre le cas!), on a aussi la notion de pointeur membre. Ca correspond � g�rer un offset ajustable dans une famille d'objets. Ca permet plut�t de changer de fonction au sein d'un m�me objet, ou entre hi�rarchie (au sens d'h�ritage) d'objets.
    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
    class Base {
        void  fct1();
        void  fct2();
        void Base::*pt_mb_fct = &Base::fct1;
     public:
        void  dorenavant_utiliser( int i ) {
            switch ( i ) {
                case 1: pt_mb_fct = &Base::fct1; break;
                case 2: pt_mb_fct = &Base::fct2; break;
            }
        }
        void  appeler_fonction_convenue() { (this->*pt_mb_fct)(); }
    };
     
    int  main() {
        Base  class;
        class.dorenavant_utiliser( 2 );
        class.appeler_fonction_convenue();  // va appeler la fct2(), donc ici l'appelant demande une fonctionnalité sans avoir
        // à explicitement retrouver une fonction, et en cas d'héritage elle pourrait être dans une sous hiérarchie (donc Class1 ou Class2).
    }

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Je ne comprends pas en quoi le public est g�nant?? Ni ce que tu entends par "exportable"? ni la p�nibilit�!
    J'ai d�velopper chaque module pour qu'il soit "ind�pendant" et donc r�utilisable sur d'autres projets. Si j'inclue l'option d'h�ritage, les modules sont moins ind�pendants. C'est plus des r�flexions personnelles quand j'ai �crit le message
    La p�nibilit� c'est de garder justement un code le plus r�utilisable possible, pouvant prendre en compte des caract�ristiques (ici l'exportation pour d'autres projets) qui au final ne me serviront peut etre jamais et rend le d�veloppement plus ... p�nible.

    Dit autrement, la lecture d'un capteur de temperature via protocol I2C dans ma boucle principale pourrait �tre :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    main () {
     
     while(true) {
     
     initialisation_I2C();
     envoi_commande_I2C(capteur_température);
     lecture_trame_I2C(capteur_température);
     desinit_I2C();  
     }
    }
    qui devient (c'est un peu simpliste ici, la class n'a aucun d'int�r�t) :

    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
     
    Class capteur_temperature {
     uint16_t get_value() {
      initialisation_I2C();
      envoi_commande_I2C(capteur_température);
      lecture_trame_I2C(capteur_température);
      desinit_I2C();  
     }
    }
     
    main () {
    Class temp capteur_temperature;
    uint16_t temperature;
     while(true) {
      temperature = temp.get_value();
    }
    Ensuite, je stock ma class dans un fichier et je peux l'inclure directement dans d'autres projets. Si j'ai l'option d'h�ritage, il faut �galement que j'inclue la seconde class, ce qui peut etre moins compr�hensible. C'est vraiment du d�tail et pour le coup c'est � mon sens plus li� � comment le compilateur arduino g�re les sources et certain d�faut de conception que j'ai h�rit� de ce fonctionnement.

    Peut-�tre souhaite-tu avoir un pointeur qui changerait de valeur pour pointer sur un autre type de donn�e?
    Les donn�es restent les m�mes. Pour les fonctions cela compilent (mais je n'ai pas test�) quand je modifie les pointeurs comme tu le fais. Pour les variables, par contre, cela ne compile pas.

    En faite, je pourrais faire cette version mais j'aurais voulu garder quelque chose de plus "joli" et moins consommateur de m�moire :

    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
    [class Class1 {
     public :
      uint8_t Var1;
      uint8_t Var2[20];
     
     void Class1();
      bool Func1(); //fait une action a
      bool Func2(); //fait une action b
    }
     
    class Class2 {
     public :
      uint8_t Var1;
      uint8_t Var2[20];
     
      void Class2();  
      bool Func1();  //fait une action c
      bool Func2();  //fait une action d
    }
     
    class Class_global() {
     public:
      uint8_t numero_Class = 0;
      Class1 Class1_Global = Class1();
      Class2 Class2_Global = Class2();
     
      void Class_global(uint8_t num) {
        numero_Class = num;
      }
     
      bool Func1() {
        if (numero_class == 1)
         return Class1_Global.Func1();
        if (numero_class == 2)
         return Class1_Global.Func2();
      }
     
      bool Func2() {
        if (numero_class == 1)
         return Class1_Global.Func2();
        if (numero_class == 2)
         return Class1_Global.Func2();
      }
     
      uint8_t get_Var1() {
        if (numero_class == 1)
         return Class1_Global.Var1;
        if (numero_class == 2)
         return Class1_Global.Var2;
      }
     
    }
     
    main{
      Class_global global[2];
      global[0] = new Class_global(1);
      global[1] = new Class_global(2);
     
      //reste du code
    }
    Je vais regarder pour les pointeur membre, � la limite pour les fonctions cela passe, c'est plus pour les variables que cela ne passe pas.
    Merci en tout cas du temps consacr�

  9. #9
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par d�faut
    Bonjour,

    Je ne suis pas un sp�cialiste du C++ loin de l�, mais je connais la POO, je vais essayer d'aider selon mes capacit�s sur ce crit�re.

    Citation Envoy� par _Froggy_
    Dans l'id�e, j'aurais voulu faire comme suit mais cela ne peut pas fonctionner (ou alors je n'ai pas trouv� comment)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    Class1 test[0] = Class1();
    Class2 test[1] = Class2();
    Dans l'id�e, tu ne peux ajouter dans test que des objets de m�me type, ce qui inclus la cr�ation d'une classe de base (une interface peut-�tre, je la nomme Base dans mon code) avec ses m�thodes communes, et qui permettront de cr�er test.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::vector<std::unique_ptr<Base>> test;
    puis d'ajouter tes instances de Class1 et Class2
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    test.push_back(std::make_unique<Class1>());
    test.push_back(std::make_unique<Class2>());
    Pour l'utilisation des m�thodes communes

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    for (const auto& obj : test) {
        obj->doSomething();
    }
    Niveau syntaxe je ne suis pas s�r, mais sur le principe, j'esp�re avoir �t� suffisamment clair...

  10. #10
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    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 153
    Billets dans le blog
    4
    Par d�faut
    Soit h�ritage parce que si tes 2 classes ont les m�mes interfaces, elles sont potentiellement logiquement li�es ?
    Soit des fonctions templates pour les g�rer.
    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.

  11. #11
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par d�faut
    Citation Envoy� par Bousk
    Soit h�ritage parce que si tes 2 classes ont les m�mes interfaces, elles sont potentiellement logiquement li�es ?
    C'est une mani�re de concevoir, sur le principe SOLID, la liaison entre classes peut diff�rer (Interface Segregation) en cr�ant plusieurs interfaces distinctes.
    On pourrait par exemple cr�er 2 interfaces distinctes h�ritant de l'interface Base.

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut
    Merci des r�ponses,
    Il faut maintenant que je mette cela en pratique

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par d�faut
    1 an plus tard

    Au final, j'ai tout r��crit de 0, ma premi�re version �tait trop sp�cifique pour des Attiny avec pas beaucoup de flash (8Ko) et sous STM32, pour le coup de la flash j'en ai plein (32Ko). Avec l'h�ritage cela passe tout seul, merci

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Tu as aussi la possibilit� de travailler avec un tableau de pointeurs vers fonction.
    Dans la mesure o� tu peux scanner tes capteurs, il est possible d'attribuer � chacun d'eux un idle auquel correspondra une fonction dans le tableau.
    C'est ce que je fais avec mes nano dans un autre contexte : r�ception de messages (2 octets => 16 actions ou plus et un param�tre).

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Par ailleurs, si on veut vraiment faire du C++, c'est � dire raisonner en termes de m�thodes, les classes :
    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
     
    class Base
    {
    public :
    	virtual void S();
    };
     
    class Classe1 : public Base
    {
    public :
    	void S();
    };
     
    class Classe2 : public Base
    {
    public :
    	void S();
    };
     
    // etc...
    Les m�thodes :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Base::S()
    {
    }
     
    void Classe1::S()
    {
    }
     
    void Classe2::S()
    {
    }
     
    // etc...
    Le compilateur mettra en place, en arri�re plan, un tableau de fonctions !
    Donc autant le faire directement, d'autant plus qu'on est dans le contexte ARDUINO !

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // les fonctions
    void S1(){} // aka void Classe1::S()
    void S2(){} // aka void Classe2::S()
    void S3(){} // aka void Classe3::S()
    void S4(){} // aka void Classe4::S()
    // déclaration de type en termes de prototype de fonction
    typedef void (* Fct)();
    // le tableau
    Fct Fonctions[4] ={&S1, &S2, &S3, &S4}; 
    //Donc exemple depuis une boucle :
    byte idle;
    for(idle = 0; idle < 4; idle++) Fonctions[idle]();

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Changement de classe d'une variable
    Par lebigboss dans le forum Langage
    R�ponses: 1
    Dernier message: 15/05/2007, 16h51
  2. R�ponses: 8
    Dernier message: 29/03/2007, 14h48
  3. R�ponses: 4
    Dernier message: 08/01/2007, 14h48
  4. [VB.NET]Test sur changement de valeur d'une variable
    Par shinji_rem dans le forum Windows Forms
    R�ponses: 9
    Dernier message: 29/11/2006, 15h53
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    R�ponses: 5
    Dernier message: 07/01/2005, 08h04

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