Tableau de pointeurs de fonctions

Résolu
Signaler
Messages postés
3
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
23 février 2005
-
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005
-
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

Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

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
Messages postés
78
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
26 avril 2005

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 ?
Messages postés
3
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
23 février 2005

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.
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

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