Tableau de pointeurs de fonctions

Résolu
cs_trapic Messages postés 3 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 février 2005 - 10 janv. 2005 à 17:06
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005 - 24 févr. 2005 à 06:20
Bonjour,



J'aimerais réaliser une procédure appelant une liste de fonctions variables à argument variables.



Exemple:

//Le tableau des fonctions et les parametres

Sequence[3] = { lire(voie1), delai(1000), ecrire(voie2,valeur)};



//La procédure qui execute les fonctions du tableau

int ExecuteSequence (void)

{

for (i=0;i<3;i++)

{

//Appel des fonctions du tableau

???

}

}


//Ce qui est equivalent à

lire(voie1);

delai(1000);

ecrire(voie2,valeur);





Merci.


Patrick.

4 réponses

cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
11 janv. 2005 à 07:24
Ca c'est du sport,

Tu code tes fonctions en premier, puis Tu declares ton tableau de fonctions.

Prends soins d'avoir toujours la meme signature pour les fonctions que tu desires inclure dans le tableau.

Dans le main appel ton pointeur sur fonction en lui passant les arguments.

Tu peux aussi faire des tableaux a plusieurs dimension.

Tu peux initialiser to tableau dans le main.

C'est super puissant, mais totalement incomprehensible. La maintenance est tres difficile.



Bonne chance.

/* mes fonctions avec la meme signature */
int f0(int a, int b){

return a - b;

}

int f1(int a, int b){

return a+b;

}

int f2(int a, int b){

return a * b;

}



/* la declaration du tableau 1 dimension seulemment mais possible de faire int (*f[]i [] ) (int, int) = { {f0,f1},{f3,f4}};*/

int (*f[]) (int, int) = {f0,f1,f2};





main(){

int ret ;

/* appel au pointeur sur f0() */

ret = (*f[0]) (1,2);

printf( "Ret = %d\n",ret);

ret = (*f[2]) (1,2);

printf( "Ret = %d\n",ret);



}
Yves
3
CriPpLe Messages postés 78 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 26 avril 2005
10 janv. 2005 à 18:24
Oula mais qu'est ce que tu nous fait là
Un tableau est censé regrouper des variables de même type, alors que là tu y mets des fonctions et en plus qui ne renverrons peut être pas le même type d'élement.

Je n'ai jamais utilisé ce type de code, donc je ne suis pas certain si ça marche ou pas mais logiquement c'est completement absurde.

De plus ça t'allonge le code pour rien, pourquoi tu veux faire ça ?
0
cs_trapic Messages postés 3 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 février 2005
23 févr. 2005 à 13:30
Merci Yves!

Excuse moi pour ma réponse très tardive... mais ta réponse est très pertinente!

La finalité, un séquenceur en C pour l'embarqué.

Le tableau des séquences:
const rom s_sequenceur st_sequenceur_test[39]=
{
//{"Message","Message Erreur",Fonction,{Paramètres},Nxt,Jmp,Exe,Lim-,Lim+,Comp,ErrPce},
{"T0:Inserer carte","Def tempo",Delai,{1000},1,38,1,0,0,0,0},
{"T0:Inserer carte","",DigitalInput,{SWITCH_CAPOT},2,38,1,1,1,1,0},
etc...

L'appel de la fonction:
// == ===========================================================================
//APPEL LA FONCTION
if ( st_sequenceur[u8_index_sequenceur].f() == TX_ERROR )
{
//erreur lors de l'exécution de la fonction
u8_erreur_systeme = 1;
}
else
{
u8_erreur_systeme = 0;
}

Une fonction:
int Delai(void)
{
//lecture des paramètres de la séquence en cours
u16_cpt_delai = (u16) st_sequenceur[u8_index_sequenceur].flt_parametres[0] / BASE_TEMPS;

while (u16_cpt_delai > 0)
{
//watchdog(); //rafraichissement du watchdog (indispensable en cas de delai supérieur au temps du watchdog!)
}
//u16_cpt_delai décrémenté dans l'IT 10 ms

return TX_SUCCESS;
}

Patrick.
0
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
24 févr. 2005 à 06:20
Tres heureux de constater que cela a pu t'aider.

J'ai aussi fais de l'embarque (embedded Linux sur serie Motorola 857T)
A+
Yves
0
Rejoignez-nous