1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include <stdio.h>
typedef struct {
int a ;
int b ;
int result ;
} MonData ;
typedef int MAPROC (void *data);
typedef struct {
int Type ;
MAPROC *Adr ;
void *Data ;
} Fct ;
#define ADD 1
#ifndef SUCCESS
#define SUCCESS 0
#define ERROR 1
#endif
static Fct *Fcts=NULL ;
static int NFcts=0 ;
MAPROC add (void *Data)
{
MonData *mdata = (MonData *)Data ;
mdata->result = mdata->a + mdata->b;
return SUCCESS ;
}
int StockeFonction ( int Type, MAPROC *MaFct, void *Data )
{
Fct tmp =NULL ;
if ( NFcts == 0 )
{
Fcts = calloc ( 1, sizeof(Fct) );
if ( Fcts == NULL )
return ERROR ;
}
else
{
tmp = realloc ( Fcts, ((NFcts+1)*sizeof(Fct)) );
if ( tmp == NULL )
return ERROR ;
Fcts = tmp ;
}
Fcts[NFcts].Adr = MaFct ;
Fcts[NFcts].Type = Type ;
Fcts[NFcts].Data = Data ;
NFcts = NFcts + 1 ;
return SUCCESS ;
}
int AppelleFonction ( int Type )
{
int i, j ;
for ( i = 0 ; i < NFcts ; i++ )
if ( Fcts[i].Type == Type )
{
j = Fcts[i].Adr ( Fct[i].Data );
return j ;
}
}
int main(void) {
MonData Data ;
Data.a = 5;
Data.b = 10;
Data.result = 0;
if ( StockeFonction ( ADD, (MAPROC *)&add, (void *)&Data ) )
{
fprintf ( stderr, "\nUne erreur s'est produite...\n");
return EXIT_FAILURE ;
}
AppelleFonction ( ADD );
printf("resultat : %d\n",Data.result);
return EXIT_SUCCESS ;
} |