prototypage de fonction

prototypage de fonction - C - Programmation

Marsh Posté le 14-04-2005 à 02:03:13    

Petite question:
 
J utilise la meme fonction avec des types differents en entree, genre:

Code :
  1. void ma_fonction_float(float **tab);
  2. void ma_fonction_int(int **tab);


Y aurait pas une astuce pour eviter de devoir creer des fonction differente a chaque fois?
Le cast ne marche pas puisque j ai un pointeur de pointeur... et passer des int** a ma_fonction_float donne un desastre puisqu il s attend a lire des info de la taille float et non pas int!
 
A part creer une fonction par type de variable passe y a t il un moyen?
 

Reply

Marsh Posté le 14-04-2005 à 02:03:13   

Reply

Marsh Posté le 14-04-2005 à 03:36:37    

Tu peux toujours passer un void ** plus, d'une manière ou d'une autre, une info sur le type pointé. Est-ce que c'est mieux qu'une fonction par type ? C'est toi qui vois suivant ce que tu veux faire.
 
Ou sinon, tu passes au C++.

Reply

Marsh Posté le 14-04-2005 à 07:47:24    

niemad a écrit :

Petite question:
 
J utilise la meme fonction avec des types differents en entree, genre:

Code :
  1. void ma_fonction_float(float **tab);
  2. void ma_fonction_int(int **tab);


Y aurait pas une astuce pour eviter de devoir creer des fonction differente a chaque fois?
Le cast ne marche pas puisque j ai un pointeur de pointeur... et passer des int** a ma_fonction_float donne un desastre puisqu il s attend a lire des info de la taille float et non pas int!
 
A part creer une fonction par type de variable passe y a t il un moyen?


 

void ma_fonction (void **tab, char type)
{
    switch (type)
    {
         case 'f':
             printf("%f\n", **((float**)tab));
             break;
         case 'i':
             printf("%d\n", **((int**)tab));
             break;
     }
}


Message édité par Sve@r le 14-04-2005 à 07:48:01
Reply

Marsh Posté le 14-04-2005 à 08:03:30    

tu as le vaarg sinon. pense printf() qui prend n'importe quelle liste..google=> va_list

Reply

Marsh Posté le 14-04-2005 à 08:11:45    

niemad a écrit :

J utilise la meme fonction avec des types differents en entree, genre:

Code :
  1. void ma_fonction_float(float **tab);
  2. void ma_fonction_int(int **tab);


Y aurait pas une astuce pour eviter de devoir creer des fonction differente a chaque fois?


Non, à moins d'écrire du code générique avec l'interface suivante (à-la-qsort()) :  

void f (void *tab, size_t size_elem, size_t nb_x, size_t ,nb_y);


qui permet de traiter les elements d'un tableau quelquonque linéaire à deux dimensions. Dans la fonction, on travaille en bytes, et on calcule les indices avec les dimensions. Les affectations se font à coup de memcpy(). Par contre, étant donné qu'on ne sait  pas la nature des données du tableau, on ne peut faire ausun calcul sur les données. Mias, (comme avec qsort()), ce calcul peut être délégué à une fonction utilisateur (callback).
 


/* type du callback (adresse et coordonnees courantes...) */
typedef int scan_data_f (void *p_data, size_t x, size_t y);
 
void f (void *tab, size_t size_elem, size_t nb_x, size_t ,nb_y, scan_data_f *pf_calcul);



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-04-2005 à 11:57:52    

Merci a tous.
J avais effectivement pas pense a utilise le type void  :sweat: Ca va me servir dans certaine fonction deja ca c est sure.

Reply

Marsh Posté le 14-04-2005 à 12:27:22    

niemad a écrit :

Merci a tous.
J avais effectivement pas pense a utilise le type void  :sweat: Ca va me servir dans certaine fonction deja ca c est sure.


 
Pas "void", "void **" [:aloy] (ou à la rigueur "void *" dans un cadre plus général...)

Reply

Marsh Posté le 14-04-2005 à 13:11:17    

Sve@r a écrit :

Pas "void", "void **" [:aloy] (ou à la rigueur "void *" dans un cadre plus général...)


 
Ouaip c est ce que je voulais dire, j ai juste eu la flemme de mettre les ** :whistle:

Reply

Marsh Posté le 14-04-2005 à 13:16:21    

tout ça c'est bien joli, mais par rapport à du template ou de la surcharge C++, en termes de performance ... c'est catastrophique :/

Reply

Marsh Posté le 14-04-2005 à 13:30:41    

C'est pas la performance qui me gêne, c'est la simplicité d'écriture... Mais bon c'est du C, avec ses avantages et ses limitations...

Reply

Sujets relatifs:

Leave a Replay

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