Pages: 1 [2]   Go Down
Author Topic: Passage avec classe  (Read 2337 times)
0 Members and 1 Guest are viewing this topic.
France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La version de l'IDE sous linux (debian) est modifiée. La modification consiste à ne pas utiliser les programmes fournis par l'IDE officielle Arduino (gcc-avr, avrdude, etc) mais ceux présent sur les dépots de la distribution et en distib "testing" cela fait belle lurette qu'avec l'IDE revu par Debian c'est gcc-avr 4.7.2.

<troll du jeudi soir>
Qui a dit que Linux est souvent à la ramasse ?
<troll/>
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Et donc tu n'as aucun problème pour compiler de l'Arduino avec avr-gcc 4.7 ?
Je croyais qu'il y avait pas mal de problèmes et qu'il fallait reprendre le code du core et de certaines lib
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moi non  smiley-mr-green, mais le mainteneur du paquet Scott Howard en eu lui je crois  smiley-confuse .
Il a du mettre les mains dans le cambouis pour que ça marche.

Si tu veux faire des comparaisons dans les fichiers tu peux télécharger le paquet ici :
http://packages.debian.org/wheezy/arduino
et
http://packages.debian.org/wheezy/arduino-core
(l'IDE est coupée en deux : l'IDE d'un coté, les bibliothèques de l'autre)
Les paquets s'ouvrent comme une archive.

En Testing et SID c'est toujours la version 1.01. La version 1.03 est toujours en Experimental.

edit :
Stable = squeeze
Testing = wheezy
Sid et experimental : les noms ne change pas.
Ubuntu est basé sur un mix Testing/SID avec une correction des bugs limitée aux deux seules architectures i386 et AMD64
« Last Edit: January 17, 2013, 04:07:47 pm by 68tjs » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et bien, j'en apprends tous les jours !!!

Donc, si je résume, il faudrais que je prenne la version fourni par Ubuntu car elle emploie une librairie à jour !! Et ben...

Bon, je reviens avec classe sur un besoin d'info sur les classes. J'en voie au fond de la classe qui ronflent !!! (Private joke)

Bien, le problème est le suivant. Je suis en train de gérer un FailSafe. En gris si divers cas se présentent, je fait diverses opération de sauvegarde du matériel. Un submersible, sans réception, c'est un peu comme un objet pouvant devenir assez instable. Il convient donc de géré certains cas en fonction. J'ai une terrible idée, faire une classe pour géré certains cas. Ainsi:

Est-il possible de transmettre en paramettre à une classe, la fonction externe à exécuté ?

Exemple théorique de ce que je voudrais faire :
Code:
/* Création objet global*/
FailSafe failReception(safeReception);
FailSafe failEtanche(safeEtanche);

void loop() {
   /* utilisation objet
   failReception.test();
   failEtanche.test();
}
 
/* Safe */
void safeReception() {
   //Options de sauvegarde sur problème radio
   //Couper les moteurs
   //Si on a attendu 200 passage
      //Lancer le safeEtanche();
   //Sinon, incrémenter un passage
}

/* Safe */
void safeEtanche() {
   //Options de sauvegarde sur problème de voie d'eau
   //Couper les moteurs
   //Mettre en marche la pompe
   //Faire clignoter les lumières
}

Voila, le but est assez compréhensible, je gère divers cas et diverses tests sur la base de flags gérér dans la classe. Ainsi je simplifie mon code principal. Seulement, j'aimerais savoir si on peut éventuellement accéder à une fonction externe de la classe.

Merci pour vos indications.
Logged

France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Donc, si je résume, il faudrais que je prenne la version fourni par Ubuntu car elle emploie une librairie à jour

Je n'ai avancé que du factuel, quant à assurer que cela fonctionnera avec gcc-acr 4.72 je n'irais pas jusqu'a affirmer dur comme fer que ce sera vrai
: je précise que je ne fais que programoter juste ce qu'il faut pour entretenir mes neuronnes qui maintenant sont plus près de 70 que de 60.

Quant à passer sur Ubuntu : oui mais juste pour voir dans le cas où tu ne connaîtrais pas Debian.
Perso j'ai commencé avec Mandrake qui est partie en sucette peu après, j'ai donc regardé du coté d'Ubuntu qui venait de sortir et dont on disait le plus grand bien.
Que neni ! J'avais gouté à la liberté avec Mandrake et avec Ubuntu j'avais l'impression de retourner sous Windows , c'est d'ailleurs le but recherché : ne pas dépayser les arrivants de windows. Mon pseudo en dit long : "il est interdit d'interdire" et je ne supporte pas qu'on décide à ma place qu'il ne faut pas de compte root et qu'on m'oblige à utiliser "sudo" à la place de "su" : c'est moi seul qui décide des conneries que je fais et que j'assume et non pas un quelquonque éditeur.
Je suis vite passé sur Debian et depuis j'y suis resté.
Et pourquoi utiliser une copie alors qu'on peut utiliser l'original ?
« Last Edit: January 18, 2013, 09:13:12 am by 68tjs » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, je suis bien d'accord avec toi. Bon, débian pur, je connais niveau serveur web, la ok. Mais débian pour du graphisme, c'est pas gagner. Imagine mes deux GTX580 qui me gère sous CUDA des rendus 3D. Pas sûr que débian pur sache faire ! Après, dans le fond, je suis d'accord avec toi.

Enfin, bref, on s'éloigne du sujet initial. Ce serais bien d'ailleurs qu'on y revienne car je ne suis pas certain que je ne ferais pas ce rappel post après post, jusqu'à ce que l'on en revienne aux classes. (Désolé si ça blesse mais je pense que l'on doit impérativement revenir sur le sujet afin de ne pas perdre le fil des lecteurs du sujet. Merci).

Merci.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Reste t'il des questions sur l'aspect "Classes" ?
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Full Member
***
Karma: 0
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, une grande.

Je cherche à accéder à une fonction comme ici:
Code:
classe obj(fonctionX(), 20);

void loop() {
obj.blabla()
}

void fonctionX() {
   //Faire un truc...
}


/* puis dans la classe */
classe::blabla() {
   //Si il se passe ça
      //Aller sur la fonctionX()
}

En gros au lieu de devoir faire ceci:
Code:
/* LOOP */
void loop() {

if(failReception.getFail()) {
Serial.println("Fail");
//fonctionSafe();
}
else {
Serial.println("Ok");
}

delay(5);
}

J'aimerais que la classe d'elle-même aille cherché la classe. Mais bon, un if me convient déjà pas mal smiley-wink
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Google -> "Pointeurs sur fonction" smiley-wink

Code:
typedef (void)(*jeSuisUnPointeurSurFonction_t)(char* avecUnJolieArgument);

jeSuisUnPointeurSurFonction_t bonjour;

void putStr(char* msg) {
    Serial.println(msg);
}

// ...
bonjour = &putStr;

// ...
bonjour("Hello callback !");
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah oui, en effet  smiley-cool

Bon, finalement j'ai opter pour une solution simpliste et pas moins efficace. Je profite d'un test dans mon programme pour déclencher ou non la fonction. Mais je retient la solution, on ne sait jamais.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le pointeur sur fonction hors-classe n'est pas une solution très esthétique d'un point de vue C++.
De plus la fonction en question ne peut pas accéder aux membres de la classe donc l'intérêt est un peu limité.
Cela répond a certains besoins c'est clair, auquels la méthode ci-dessous ne peut pas répondre.

Mais je pense que ca vaut le coup de citer la notion de fonction virtuelle et de classe dérivée comme je l'ai utilisé dans ma lib de timer soft : http://arduino.cc/forum/index.php/topic,101814.0.html

Le besoin étant généralement d'avoir des objets qui partagent un comportement commun mais dont une fonction est différente tout en pouvant les manipuler comme des objets identiques via une classe de base.

On crée une classe de base avec des fonctions et des variables qui seront communes à toutes les différentes versions :

Code:
class Base
{
public:
  Base() { variablecommune = 0; };
  ~Base();

  int FonctionCommune( int param ) { variablecommune += param; return variablecommune; }

  virtual int FonctionSpeciale( int param ) = 0; // Fonction virtuelle pure
};

Une fonction virtuelle pure ne peut pas être instanciée (on ne peut pas créer d'objet de ce type) mais on peut manipuler sous la forme de Base des objets d'une classe dérivée.

Ensuite on crée des classes dérivées qui vont avoir des variables et des comportements adaptés :

Code:
class Derivee1 : public Base
{
public:
  Derivee1() : Base() { variable1 = 1; }
  ~Derivee1();

  virtual int FonctionSpeciale( int param ) { variable1 = variablecommune + param; return variable1; }

  int variable1;
}

class Derivee2 : public Base
{
  Derivee2() : Base() { variable2 = 2; }
  ~Derivee2();

  virtual int FonctionSpeciale( int param ) { variable2 = variablecommune - param; return variable2; }

  int variable2;
};


et créons 2 objets ;

Code:
Derivee1 Objet1();
Derivee2 Objet2();

Jusque là rien de bien spéciale. C'est de la dérivation normale.

Mais l'avantage de l'utilisation de cette méthode c'est que l'on peut ensuite manipuler les objets Objet1 et Objet2 par exemple via des pointeurs ou des références sur un objet de type Base.
Code:
int Test( Base &objet, int param )
{
  return objet.FonctionSpeciale( param );
}

Ailleurs()
{
  Test( Objet1 );
  Test( Objet2 );
}

Dans le code ci-dessus, la bonne FonctionSpeciale() sera appellé pour Objet1 ou Objet2 bien qu'ils soient manipulés dans Test() comme un objet de type Base.
Si les FonctionsSpeciale() n'étaient pas virtuelles, c'est la version Base::FonctionSpeciale() qui serait appellée.




 
« Last Edit: January 18, 2013, 05:06:33 pm by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Full Member
***
Karma: 0
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, je comprends mieux en effet ce qui se passe.  smiley-cool

Par contre je pense quand même que ça peut-être utile de l'avoir abordé. Ne serais-ce que pour comprendre comment certaines librairies fonctionnent  smiley-lol

En revanche, pour appliquer, il faut quand même être doué !
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La solution d'un héritage avec des classes dérivés et des fonctions virtuelle est bien plus "propre" d'un point de vue C++ qu'un callback sur fonction.

Mais le truc c'est que, qui dit virtual dit vtable, donc plus de place en mémoire requise pour la classe compilé et surtout une perte de temps à l'exécution pour accéder à la fonction la plus spécialisé de la classe dérivé.

C'est pour ça que la solution callback + fonction getter/setter me semble plus adapté sur des microcontrôleurs "léger" smiley-mr-green
Aprés tout est relatif si on est pas à quelques octets et à quelques nanosecondes prés un virtual c'est trés bien smiley-mr-green
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: 1 [2]   Go Up
Jump to: