See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [C++] Fonctions à N arguments  (Read 31531 times)

0 Members and 1 Guest are viewing this topic.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
14 August 2007, 03:05:35
D'abord, un petit exposé de la situation ... qui fonctionne,
puis une question simple qui suit, celà concerne à la fois
des problèmes d'optimisation, mais aussi de pratique dans
l'écriture d'un cpp ...

Exemple

Code: [Select]
case AID_ATMOSPHERE:
if (iEtatSysteme[SYSTEM_ATMOSPHERE]==1 && SYSatmo.bFaitClignoterAlarme == TRUE)
{
oapiBlt (surf, srf[6], 0, 0, (SYSTEM_ATMOSPHERE-1)*37, 0, 37, 37);
}
else if (iEtatSysteme[SYSTEM_ATMOSPHERE]==1 && SYSatmo.bFaitClignoterAlarme == FALSE)
{
oapiBlt (surf, srf[6], 0, 0, (SYSTEM_ATMOSPHERE-1)*37, 37, 37, 37);
}
else if (iEtatSysteme[SYSTEM_ATMOSPHERE]==0 || SYSatmo.bResetAlarmOnPanelZero  == TRUE)
{
oapiBlt (surf, srf[6], 0, 0, (SYSTEM_ATMOSPHERE-1)*37, 37, 37, 37);
iEtatSysteme[SYSTEM_ATMOSPHERE]=0;
}
return true;

Suivent 10 cases du même tonneau ...
Chaque système est basé sur une structure et renvoie
donc des variables et des SURFS SOLIDES dans les trigger!
C'est du code très redondant, "et celà me heurte un peu car
je me dis qu'un ordinateur est justement conçu pour réaliser les
tâches répétitives à notre place, donc tout ça pour ne pas
dire que c'est probablement du code de groin groin mais il fonctionne.

J'essaye donc de franchir une étape et essaye de m'inspirer de la fonction
de Martin qui dessine les MFDs

Elle traite les case de cette façon .... en rafale ...

Code: [Select]
case AID_MFD1_LBUTTONS:
RedrawPanel_MFDButton (surf, MFD_LEFT, 0);
return true;

case AID_MFD1_RBUTTONS:
RedrawPanel_MFDButton (surf, MFD_LEFT, 1);
return true;

case AID_MFD2_LBUTTONS:
RedrawPanel_MFDButton (surf, MFD_RIGHT, 0);
return true;

Je fais donc ça dans les case qui me renvoient à une fonction qui pour l'instant ne
fait pas grand chose, si ce n'est qu'elle affiche correctement les surfs et ne fait
pas de bugs ( pour le moment :badsmile: )

Code: [Select]
case AID_MECHANICAL_OPEN_DOCK:
case AID_MECHANICAL_SELECT_DOCK:
case AID_MECHANICAL_SPEED_ROTATION_ARM:
case AID_MECHANICAL_GEAR:
case AID_ENERGIE_SELECT_POWER:
case AID_XFEED:  
case AID_SELECTTANKOUTPUT:
case AID_SELECTPROBE:
case AID_LIFE_SUPPORT_SELECT_WATER_TANK:
RedrawPanel_Bouton_Selecteur (surf);
return true;

Pour l'instant les bilt sont en dur dans le code, c'est juste pour vérifier qu'il n'y a
pas eu de gourrance sur l'ordre, la taille etc des morceaux de bitmap.


Code: [Select]
void Irridium::RedrawPanel_Bouton_Selecteur (SURFHANDLE surf)
{
if(!surf)
return;
bool bCentVingtCinqAntiHoraire = false;
bool bQuatreVingtDixAntiHoraire = false;
bool bQuaranteCinqAntiHoraire= false;
bool bZeroDegre = false;
bool bQuaranteCinqHoraire = false;
bool bQuatreVingtDixHoraire = false;
bool bCentVingtCinqHoraire = false;
bool bCentQuatreVingtDegre = false;

if(bCentVingtCinqAntiHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 0, 30, 30);
else if(bQuatreVingtDixAntiHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 30, 30, 30);
else if(bQuaranteCinqAntiHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 60, 30, 30);
else if(bZeroDegre == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 90, 30, 30);
else if(bQuaranteCinqHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 120, 30, 30);
else if(bQuatreVingtDixHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 150, 30, 30);
else if(bCentVingtCinqHoraire == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 180, 30, 30);
else if(bCentQuatreVingtDegre == TRUE)
oapiBlt (surf, srf[1], 0, 0, 330, 210, 30, 30);
else
oapiBlt (surf, srf[1], 0, 0, 330, 90, 30, 30);
}



Ensuite, je pensais créer une tambouille à base de if de else de else if
qui triturerait des variables de classe en structure par sytème pour faire
clignoter tout ce joli monde en mesure.

Donc, la question maintenant ...

Y'a t'il moyen d'optimiser en créant une fonction à N arguments, comme celle des MFDs
dans laquelle je renverrais par exemple le bouton concerné, son ON ou son OFF
enfin tout un tas de trucs  ( mais sans variables de classe ) pour construire au
bon moment la surf dont j'ai besoin à tel endroit puis à tel autre etc ...

Et ce, sans avoir à écrire séparément les 250 cases comme sur l'exemple du haut ?


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 14 August 2007, 03:23:45
T'a pas une image de ce que tu veux faire ? pasque comprendre l'idée en partant du code :sick:

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #2 - 14 August 2007, 03:51:09
OKI ... mon premier exemple avec les 10 cases fait clignoter 10 loupiotes
comme ça  .... à peu près ... en vrai c'est moins speed ;)



Si j'ai deux cent diodes qui doivent clignoter de la même façon réparties un peu
partout sur le panel, j'aimerais pouvoir éviter les 200 cases compliqués et tout
renvoyer dans une UNIQUE fonction qui gérerait TOUTES les diodes de n'importe
quel système ...



En fait, chaque bouton possède sa propre fonction dans mon exemple ...
Sauf qu'au lieu d'écrire
case bidule:
redraw_bidule();
return true;

J'ai écrit ma fonction directement dans le case .. ce qui ne change rien sur le fond.
Mais ce que je pressens sans en être sûr c'est que je vais encore me retrouver
avec des si le chat est à Martin, il a peut être faim mais pas sûr si je cherche à tout prix
à n'écrire qu'une seule fonction !



Message modifié ( 14-08-2007 03:56 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 14 August 2007, 04:19:01
Ouais mais la tu aura un effet pervere (pepere)

Ca fait con !

Que deux trois trucs du même systeme dans la meme zone clignotent en rhytme ca va encore
mais que tout le panel le fasse la ca va faire très naze.... genre mauvaise SF
avec un vaisseau en carton pate et des loupiottes de lampe de poche et pile 9v.

En 2nd le clignotement faut pas en abuser, c'est vraiment pour du warning voir juste
un pilote auto ou un prog qui run...

Si c'est comme ton gif sur le meme warning c'est bon, si c'et sur tout le panel j'ai des doutes
sur le look...

L'autre prob c'est qu'a moins de declarer une zone de 1280x400 une zone à pas accès aux surf
ailleurs...



Avant les classes trop compliqué pourquoi pas utiliser les tableaux.... avec des variables qui definissent chaque diode
et surtout des nom de zones qui ce suivent absolument en reutilisant au maximum pour simplifier... j'explique

Bouge pas...

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #4 - 14 August 2007, 04:28:21
L'effet carton pâte je l'ai déjà un peu parce que j'ai basé pas mal de trucs sur simt
Par exemple, pendant un remote thrust, une diode clignote pendant le countdown...
Si une alarme se déclenche en même temps sur le panel .... pouf .... ça se met à clignoter en rythme...
Et oui, ça fait très naze ... :sad:

Pour l'instant, mon seul tempo est la seconde, ou des multiples de la seconde ... mais ça a vite ses limites, quand un
warning se met à cligner toutes les cinq secondes parce que j'ai plus trop le choix, c'est plus un warning.

Mais pas des , :doubt: je sais plus comment on dit pour l'inverse de multiple, des "bouts" de seconde quoi :badsmile:
Et puis t'inquiète pas, c'est pas pour faire un sapin de noël, c'est juste pour faire clignoter deux diodes en alternance
pendant la release de l'ouverture d'une porte par exemple  ... des trucs subtils quoi ;)

Les tableaux, j'ai un peu commencé à expérimenter...
   int iGraviteDeLaPanne[10];
   int iDelaiAvantDeclenchementPanne[10];
   int iEtatSysteme[10];  
   int iOldStateSysteme[10];



Message modifié ( 14-08-2007 05:29 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #5 - 14 August 2007, 04:47:10
Bon le principe est très simple mais c'est un peu compliquer a expliquer j'y vais lentement lis bien tout...

PRINCIPE:
on va utiliser les meme identificateur pour tout le monde, zone, variable etc etc ca va grandement simplifier l'ajout de
tout nouveau bouton.

D'abord une note sur le enum... enum est une sorte de #define ou le mot clé suivant augment automatiquement de 1

Code: [Select]
enum
{
    VALEUR_A= 12,
    VALEUR_B,      // 13
    VALEUR_C,      // 14
}

si on met rien a la premiere ca commence a zero

Code: [Select]
enum
{
    VALEUR_A,      // 0
    VALEUR_B,      // 1
    VALEUR_C,      // 2
}

Donc:

int SalutPicto=VALEUR_B

Sera egal a un dans le dernier cas...


Si tu a compris tout ca je continue


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #6 - 14 August 2007, 04:51:26

Pratique ça ...
Ca peut remplacer tous les define ?


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #7 - 14 August 2007, 04:55:00
En deuxieme pour traiter en une fois un grand nombre de variable, le prob des variables c'est que si tu a des noms
différent tu est obliger de les mettre explicitement dans le code:

int MaVariableBernard  =1
int MaVariableGeorge   =1

La tu peux rien faire:

if(MaVariableBernard  )
.....
else if(MaVariableGeorge   )
.....


Mais si tu utilise des tableaux tu peux toutes les traiter en une fois:

Code: [Select]
enum
{
    GEORGE,   //0
    BERNARD, //1
    ALBERT,    //2
}
MesVariables[3];

On a encore des noms spécifique:

Code: [Select]
MesVariables[GEORGE]=1;
MesVariables[BERNARD]=1;
MesVariables[ALBERT]=1;


Mais la ca autorise des traitement en masse:

Code: [Select]
// reinitialise toutes les variables
for(I=GEORGE;I<ALBERT;I++)
      MesVariables[I]=0;


Et des appels de fonction sans connaitre quel variable sera traitée a l'avance:

Code: [Select]
function(int quelvariable)
{
    if(MesVariables[quelvariable]==TRUE)
        TraiteLaZone(quelvariable);
}

// traite la zone george
function(GEORGE);


C'est clair jusque la ?

Dan



Message modifié ( 14-08-2007 04:59 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #8 - 14 August 2007, 04:56:09
Quote
picto a écrit:
Pratique ça ...
Ca peut remplacer tous les define ?

mouis... l'aurais fallu commencer des le debut mais ... oui


Je continue ?

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #9 - 14 August 2007, 04:58:27
Bon t'est pret pour un truc tout auto ou du plus simple ?

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #10 - 14 August 2007, 04:59:47

Très clair ... là ou ça pêchait un peu, c'était sur comment faire communiquer un tableau avec une fonction...
Mais sur ton dernier exemple, c'est nickel ... On voit tout de suite ce qui se passe ... j'ai déjà un peu extrapolé pour au
moins diminuer sensiblement le nombre de fonctions à créer pour gérer des événements de même type ...


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #11 - 14 August 2007, 05:04:53
Un truc qui risque de poser probleme c'est a chaque ajout tu doit tripoter tes tableaux, redimensionner etc etc...

Code: [Select]
enum
{
    GEORGE,   //0
    BERNARD, //1
    ALBERT,    //2
    PICTO,      //3
}
MesVariables[3];

MesVariables[PICTO]=1;   // ERREUR ERREUR LE TABLEAUX FAIT 3 VALEURS ET PICTO C'EST LA QUATRIEME !!!


Donc on rajoute un mot clé a la fin qu'on n'utilise jamais mais qui redimensionne automatiquement notre tableau:


Code: [Select]
enum
{
    GEORGE,   //0
    BERNARD, //1
    ALBERT,    //2
    PICTO,      //3
    FIN_VARIABLE  //4
}
MesVariables[FIN_VARIABLE];

MesVariables[PICTO]=1;   // C'EST OK !!!


Si tu en rajoute une tu la met avant fin variable:


Code: [Select]
enum
{
    GEORGE,   //0
    BERNARD, //1
    ALBERT,    //2
    PICTO,      //3
    DANSTEPH, //4
    FIN_VARIABLE  //5
}
MesVariables[FIN_VARIABLE];

MesVariables[DANSTEPH]=1;   // C'EST AUTOMATIQUEMENT OK !!!


T'est toujours la ?

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #12 - 14 August 2007, 05:05:24
Attend je te mache le boulot... bouge pas


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #13 - 14 August 2007, 05:07:40
Le gag ca va etre d'utiliser la meme ID pour les zone AID et pour les variables mais
Nos zone AID elle vont pas aimer qu'on commence a zéro (deja pris)

#define AID_MADIODE       54


Mais si on fait ca c'est nos variables qui vont pas aimer elle, elle commencent a zéro:

MesVariables[AID_MADIODE]  /// ERREUR LE TABLEAU COMMENCE A ZERO:


J'accellere....


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #14 - 14 August 2007, 05:08:28
Code: [Select]
// DANS LE HEADER EN DEHORS DE LA CLASSE
// pour nos zone AID on rajoute un nombre on peut pas commencer a zero
#define AID_DIODE =54

// on enum tout nos boutons, si on en rajoute on le fera avant le dernier FIN_DIODE
// qui ne sert qu'a nous donner ou ca fini cette enum.
enum Suit {
   DIODE_PANNE_EGT,   // prend la valeur 0
   DIODE_PANNE_AML,   // prend la valeur 1
   DIODE_REFUEL_ON,   // prend la valeur 2
   DIODE_DOCKING_OFF, // prend la valeur 3
   FIN_DIODE          // prend la valeur 4
};



Message modifié ( 14-08-2007 05:08 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 14 August 2007, 05:09:48
Code: [Select]
// DANS LE HEADER MAIS DANS LA CLASSE
//nos variables etat des diode
BOOL VariableEtatDiode[FIN_DIODE];
//et les position x et y sur la bitmap pour le blt.
int iBmpPosDiode_X[FIN_DIODE];
int iBmbPosDiode_Y[FIN_DIODE];


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #16 - 14 August 2007, 05:10:34
Code: [Select]
//declaration des zones diodes dans panel:
oapiRegisterPanelArea (AID_DIODE+DIODE_PANNE_EGT,...)   //zone 54
oapiRegisterPanelArea (AID_DIODE+DIODE_PANNE_AML,...) //zone 55
oapiRegisterPanelArea (AID_DIODE+DIODE_REFUEL_ON,...)   //zone 56
oapiRegisterPanelArea (AID_DIODE+DIODE_DOCKING_OFF,...) //zone 57


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #17 - 14 August 2007, 05:11:19
Et en dernier:

Code: [Select]
void Irridium::clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf)
{
    // toutes les zone diode appeleront la meme fonction:
if(id>=AID_DIODE+DIODE_PANNE_EGT&&id<AID_DIODE+FIN_DIODE)
{
// on passe l'id pour retrouver les bonne variables
RedrawPanel_Bouton_Selecteur(surf,id);
return 1;  // ne traite pas le "switch(id)" dans ces cas
}
}
void Irridium::RedrawPanel_Bouton_Selecteur (SURFHANDLE surf,int id)
{
//ici id=54 si c'est la zone zéro, nos variables elle commencent a zero
// donc on deduit l'offset des zone diode
id=id-AID_DIODE;
//voila c'est bon si ID a la bonne valeur
if(VariableEtatDiode[id]==TRUE)
{
oapiBlt (surf, srf[1], 0, 0,BitmapPositionDiode_X[id],BitmapPositionDiode_Y[id], 30, 30);
}
}



Message modifié ( 14-08-2007 16:04 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #18 - 14 August 2007, 05:12:22
 
Ca c'est excellent !
Genre de trucs qu'il faut du temps et une certaine connaissnace  pour l'imaginer !
Merci pour la combine :wor:

[code]   FIN_VARIABLE  //5
}
MesVariables[FIN_VARIABLE];[/cpp


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #19 - 14 August 2007, 05:13:06
Pour acceder et changer les variables dans le code c'est facile, que ce soit dans clbkSetClasseCap pour initialisation
ou alors en runtime pour les bouger:

Code: [Select]
VariableEtatDiode[DIODE_PANNE_EGT]=FALSE;
VariableEtatDiode[DIODE_PANNE_AML]=TRUE;
VariableEtatDiode[DIODE_REFUEL_ON]=FALSE;
VariableEtatDiode[DIODE_DOCKING_OFF]=TRUE;


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #20 - 14 August 2007, 05:14:20
mais vaudrais mieux prendre un nom court pour le tableau, le mot clé sera plus evident:

Code: [Select]
Diode[DIODE_PANNE_EGT]=FALSE;
Diode[DIODE_PANNE_AML]=TRUE;
Diode[DIODE_REFUEL_ON]=FALSE;
Diode[DIODE_DOCKING_OFF]=TRUE;


Attend t'a pas tout vu :)


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #21 - 14 August 2007, 05:17:32
Comme on a aussi deux tableau pour la position x et y a bliter:

int iBmpPosDiode_X[FIN_DIODE];
int iBmbPosDiode_Y[FIN_DIODE];


Pour definir une nouvelle diode il suffit:

1-de rajouter le mot clé avant "FIN_VARIABLE"
2-de rajouter un oapiRegisterPanelArea (AID_DIODE+MOT_CLE) avec la position de la zone
3-De remplir les variables iBmpPosDiode_X et _Y pour savoir d'ou viendront les bitmap a blitter
3-d'initialiser la nouvelle variable dans classcap Diode[MOT_CLE]=FALSE;

Le reste affichage en fonction de l'etat sera automatique...

Mais c'est pas tout :badsmile:



Message modifié ( 14-08-2007 05:18 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #22 - 14 August 2007, 05:21:38
Quote
if (iEtatSysteme[SYSTEM_ATMOSPHERE]==1

J'étais sur la bonne voie, mais jamais je n'aurais eu l'imagination de pousser les choses à ce point !
BRAVO ! C'est excellent et d'une simplicité étonnante quand on le voit fait !
Mais, je le redis, de là à tout imaginer, pour l'instant, il y a un monde ! :wor:



Message modifié ( 14-08-2007 05:23 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #23 - 14 August 2007, 05:23:37
On à qu'a faire une fonction pour definir un nouveau bouton d'un coup dans clbkSetClassCap:

void InitialiseBouton(int MotCle,int SourceBitmapX,int SourceBitmapY,BOOL EtatInitial);

Cette fonction nous remplira d'un coup toutes les variables:


Code: [Select]
void InitialiseBouton(int MotCle,int SourceBitmapX,int SourceBitmapY,BOOL EtatInitial)
{
      Diode[MotCle]=EtatInitial;
      iBmpPosDiode_X[MotCle]=SourceBitmapX;
      iBmpPosDiode_Y[MotCle]=SourceBitmapY;
}

Du coup tu initialise la variable et definie les zones d'ou blitter d'un coup dans clbkSetClassCap:

InitialiseBouton(DIODE_FUEL,300,30,FALSE);
InitialiseBouton(DIODE_EJECT,300,60,FALSE);
InitialiseBouton(DIODE_DOCK,300,90,TRUE);
InitialiseBouton(DIODE_VOLET,300,30,FALSE);
InitialiseBouton(DIODE_TRAIN,300,30,FALSE);


Mais c'est pas tout :)


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #24 - 14 August 2007, 05:25:56
Pourquoi ne pas automatiser AUSSI la declaration chiante de oapiRegisterPanelArea ???

Hein ? alors !!!!

Du coup:

1-tu declare un nouveau mot cle
2-tu appel la fonction qui nitialise ta diode d'un coup dans clbkSetClassCap
3-... ah non rien... c'est pret a etre utilisé

J'explique comment ?..