Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Q?: pointeur sur fonction pour gestion evenement

1 réponse
Avatar
olric
Bonjour.

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 :

* * * QUESTION N°1 * * *

/* ----------------------------------------------- */

// 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

flux de donnes
===================>

+---+
|IO1|\
+---+ \
+---+ > +---+
|IO2|--> |Mux|-->
+---+ > +---+
+---+ / ^
|IO3|/ |
+---+ |
... choix du periphrique




MulRead() va appeller IO1Read() si IO1 est le périf actuellement
sélectionné,
et ainsi de suite.



Lors de son initialisation, le multiplexeur initialise un tableau de
structure
: (une entrée par périphérique)

/* ----------------------------------------------- */

struct S_DEVICE_DESCRIPTOR
{
char *type;
unsigned char prefered_mode; // Text Raw
Extract/Hexa/RawScreen/RawSound
unsigned char mode; // Text Raw
Extract/Hexa/RawScreen/RawSound
unsigned long address;
bool (*init)(void);
bool (*close)(void);
unsigned char (*read)(unsigned long);
void (*write)(unsigned long,unsigned char);
unsigned long (*getsize)(void);
char * (*getname)(void);
unsigned char (**onOverflow)(unsigned long *);
} _DEVList[DEV_MAX];



/* functions */
bool (*DEVInit)(void);
bool (*DEVClose)(void);
unsigned char (*_DEVRead)(unsigned long);
void (*DEVWrite)(unsigned long,unsigned char);
unsigned long (*DEVGetSize)(void);
char * (*DEVGetName)(void);


/* events */
unsigned char (*DEV_OnOverflow)(unsigned long *); // pointeur sur la
// fonction de gestion de l'évènement, implémenté qqpart ailleurs
// dans l'application



[...]

// initialisation * * * * * * * * * * * * * * * * * * * * * *

_DEVList[_DEVIndex].type = "nvram"; // DEVGetType()
_DEVList[_DEVIndex].prefered_mode = CMD_HexaView; // DMODE_HEX;
_DEVList[_DEVIndex].read = IORead; // DEVRead()
_DEVList[_DEVIndex].write = IOWrite; // DEVWrite()
_DEVList[_DEVIndex].getsize = IOGetSize; // DEVGetSize()
_DEVList[_DEVIndex].init = IOInit;
_DEVList[_DEVIndex].close = IOClose;
_DEVList[_DEVIndex].getname = // etc., etc.

_DEVList[_DEVIndex].onOverflow = &IO_OnOverflow; // <--
affectation de
// l'adresse sur le pointeur sur fonction (là commencent mes ennuis)

[...]

// slction d'un priphrique d'entre * * * * * * * * * * *


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;

return _DEVList[dvsIndex].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'.


Merci d'avoir pris le temps de me lire ^_^

1 réponse

Avatar
olric
oups, la question N°2 n'a pas lieu d'etre, le code source fourni est le
bon, je me suis juste trompé en testant.

desolé. merci de votre attention.