C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Q?: pointeur sur fonction pour gestion evenement

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
olric
Guest





PostPosted: Tue Sep 06, 2005 7:36 am    Post subject: Q?: pointeur sur fonction pour gestion evenement Reply with quote



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

+---+
Quote:
IO1|
+---+

+---+ > +---+
Quote:
IO2|--> |Mux|--
+---+ > +---+

+---+ / ^
Quote:
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 ^_^

Back to top
olric
Guest





PostPosted: Tue Sep 06, 2005 9:19 am    Post subject: Re: Q?: pointeur sur fonction pour gestion evenement Reply with quote



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.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.