J'ai une librairie qui constitue un module d'entrée pour mon application
(qui
dispose de multiple modules d'entrées suivant le même modèle). Elle est
consitutée grosso modo comme suit :
// cette variable contient la taille en octets du
// bloc de donnée sur le périphérique auquel on accède
// via cette librairie
unsigned long _IO_Size;
// pointeur sur fonction pour gestion de l'EVENEMENT
// 'OnOverflow' çàd tentative d'acces au-delà de la
// fin du bloc de données.
unsigned char (*IO_OnOverflow)(unsigned long *);
bool IOInit(void) // renvoie 1 si succès, 0 si echec
bool IOClose(void)
unsigned char IORead(unsigned long adrs)
{
if (adrs<_IO_Size)
{
// routine d'acces
return (unsigned char) some_byte;
}
else return IO_OnOverflow(&adrs);
}
void IOWrite(unsigned long adrs, unsigned char value)
unsigned long IOGetSize(void) { return _IO_Size; }
C'est du C++, mais il n'y a pas d'objet. Pourquoi ? cette librairie a
vocation
terme a devenir une librairie à liaison dynamique et je me suis laissé
dire,
peut-etre tort, que par exemple, les DLL de windows n'étaient pas objet.
QUESTION : Peut-on faire des librairie liaison dynamique en POO ? cela
a-t'il
une utilité ? quels sont les avantages comparatifs ?
* * * QUESTION N2 * * *
Pour accéder aux différents périphériques, l'application est munie d'une
sorte
de multiplexeur qui fournit une interface unique pour tout périphérique
/* events */
unsigned char (*DEV_OnOverflow)(unsigned long *); // pointeur sur la
// fonction de gestion de l'évènement, implémenté qqpart ailleurs
// dans l'application
unsigned char DEVSelect(unsigned long dvsIndex)
{
if (dvsIndex>=_DEV_COUNT) return CMD_Void;
else _DEVIndex = dvsIndex;
DEVInit = _DEVList[_DEVIndex].init;
DEVClose = _DEVList[_DEVIndex].close;
_DEVRead = _DEVList[_DEVIndex].read;
DEVWrite = _DEVList[_DEVIndex].write;
DEVGetSize = _DEVList[_DEVIndex].getsize;
DEVGetName = _DEVList[_DEVIndex].getname;
*_DEVList[_DEVIndex].onOverflow = DEV_OnOverflow; // <-- là je tente
// d'affecter au pointeur sur fonction propre au module d'entrée
// sélectionné l'adresse de la fonction qui gère son évènement, elle
// même pointe par DEV_OnOverflow
if (_DEVList[_DEVIndex].mode==CMD_Void)
_DEVList[_DEVIndex].mode=_DEVList[_DEVIndex].prefered_mode;
QUESTION : Si vous avez bien lus les rares commentaires qui accompagne
ce code
source, vous aurez remarqué que mon problème est le suivant : je
n'arrive pas à
affecter correctement au pointeur sur fonction du module d'entrée,
l'adresse de
la fonction destinée grer l'évènement 'OnOverflow'.