int nomFonction[nbElement](void)

int nomFonction[nbElement](void) - C - Programmation

Marsh Posté le 24-01-2019 à 10:07:45    

Hello
 
J'ai une question tordu, je me doute que ce que je veut n'est pas faisable,m ais je cherche à faire le moins sale/le plus flexible.
 
Aujourd'hui j'ai une fonction sous la forme

Code :
  1. int nomFonction(void)
  2. {..}


 
Suite à une modif du besoin je doit avoir plusieurs fois la fonction.
Le niveau débutant que j'ai actuellement dans le code fait par un collègue c'est
 

Code :
  1. int nomFonction(void)
  2.   int variable;
  3.   ..
  4. }
  5. int nomFonction2(void)
  6. {
  7.   int variable2;
  8.   ..
  9. }
  10. int nomFonction3(void)
  11. {
  12.   int variable3;
  13.   ..
  14. }


 
J'aime pas c'est sale et ça prends des lignes de code pour rien.
Le jour où je veut ajouter ou enlever des fonctions je doit faire des copier/merder dans le source. Bref je veut optimiser ça.
 
J'ai l'idée de faire ça:
 

Code :
  1. int nomFonction[nbElement](nbElement)
  2. {
  3.   int variable[nbEelement);
  4.   ..
  5. }


 
ça passe en C99 ce truc? car le nbElement serais un #define. Comme ça tout mon code évolue en fonction du nombre d'éléments que j'ai besoin.
 
Pour mes autres fonctions du code je fait un  

Code :
  1. int nomFonction(nbElement,..,..)
  2. {int variable(nbEelement);
  3. ..}


Mais pour la fonction en haut, je veut un thread par fonction.  
Comme ça je fait  

Code :
  1. CmtScheduleThreadPoolFunctionAdv (TrhreadPool, nomFonction[elementChoisi],..);


Aujourd'hui le besoin c'est de doublé la fonction, mais ça peut évoluer.
 
Je suis en C99 avec Labwindows/CVI 2017.
 
On les connais les loulous à la R&D, toujours prévoir l'improbable et l'ajout de dernière minute :o


---------------
Monde de merde | Restez curieux
Reply

Marsh Posté le 24-01-2019 à 10:07:45   

Reply

Marsh Posté le 26-01-2019 à 15:47:23    


Ce que tu cherches à faire c'est un tableau de pointeurs de fonctions.
 
 

Code :
  1. int (*nomFonction[nbElement])(void); /* un tableau de pointeurs de fonction. */


 

Reply

Marsh Posté le 29-01-2019 à 18:58:47    

Oui merci c'est ça.  En plus j'utilise déjà plus ou moins cette idée couplé avec des typedef dans une partie du code existant faut par d'autres.


---------------
Monde de merde | Restez curieux
Reply

Marsh Posté le 31-01-2019 à 10:13:19    

Du coup ça compile, on verras au débug, mais cette partie devrais fonctionner
 
Dans le .h j'ai mis

Code :
  1. typedef int (*CVICALLBACK TypeCom_Tick_Interface) (int*);
  2. CVICALLBACK TypeCom_Tick_Interface gCom_Tick_Interface[NUMBER_OF_INTERFACE];


 
et dans le .c

Code :
  1. int CVICALLBACK Com_Tick_interface0 (int *functionData)
  2. {..}
  3. int CVICALLBACK Com_Tick_interface1 (int *functionData)
  4. {..}
  5. ..
  6. int CVICALLBACK Com_Tick_interface5 (int *functionData)
  7. {..}
  8. static int AssignComTick (int reserve)
  9. {
  10.   gCom_Tick_Interface[0] = Com_Tick_interface0; 
  11.   gCom_Tick_Interface[1] = Com_Tick_interface1; 
  12.   gCom_Tick_Interface[2] = Com_Tick_interface2; 
  13.   gCom_Tick_Interface[3] = Com_Tick_interface3; 
  14.   gCom_Tick_Interface[4] = Com_Tick_interface4; 
  15.   gCom_Tick_Interface[5] = Com_Tick_interface5; 
  16.    
  17.   return 0;
  18. }
  19. int DLLEXPORT Drv_StartCom(int interface)
  20. //Create a dedicated pool for the can management /!\ on 4c/4t cpu, max thread is 10!  
  21.   CmtNewThreadPool (ATTR_TP_MAX_NUM_THREADS, &PoolCan);
  22. //Schedule the function with high priority  
  23.   return CmtScheduleThreadPoolFunctionAdv (PoolCan, gCom_Tick_Interface[interface], &interface, THREAD_PRIORITY_HIGHEST, EndSequenceMainLoop, EVENT_TP_THREAD_FUNCTION_END, &interface,
  24. RUN_IN_SCHEDULED_THREAD, &ThreadFunctionID[interface]);
  25. }


 
Maintenant je peut avoir une fonction générique Drv_StartCom peut importe le nombre d'interface dans mon system. Ça permet de n'avoir une ligne pour la création du thread au lieu d'une par interface.  
Thanks


---------------
Monde de merde | Restez curieux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed