Fonction s'appliquant à tous les types en C.

Yakurena -  
 Jolkdarr -
Bonsoir,
je dois faire une fonction ayant le type (void*) en paramètre afin qu'elle puisse s'appliquer sur n'importe quel type. J'aimerais savoir quelle est la syntaxe d'une telle fonction.(en particulier comment on compare des variables dont on ne connait pas le type).
Merci d'avance

4 réponses

Jolkdarr
 
Hello !

Comme dirait Shakespeare :

"To need to know the type or not, that is the question."

Dans le premier cas, tu manipule en permanence des "void*" comme dans l'exemple ci-dessous :
void* min(void* p1, void* p2)
{
    return p1 <= p2 ? p1 : p2;
}

Dans le cas où le type doit être connu, il te faut un moyen de le définir comme dans l'exemple suivant :
int data(void* where, int how)
{
    switch (how)
    {
    case 0: return *(char*) where;
    case 1: return *(short*) where;
    case 2: return *(long*) where;
    default: return *(int*) where;
    }
}


Take care !
0
Yakurena
 
Mais dans ce cas,il faut saisir une variable entière ("how" dans ton exemple) qui va déterminer le type pointé. Le problème est que je dois simuler la classe "Vector" du C++ qui contient des fonctions appliquables sur un pointeur de n'importe quel type. Il faudrait donc pouvoir définir le type pointé de façon plus automatique.
0
Jolkdarr
 
La classe Vector est une classe générique. C'est-à-dire un modèle pour définir des classes utilisables pour tout type de données.

Pour ce type de problème en C, tu as deux possibilités :

1. utiliser un paramètre systématique qui donne la taille d'un élément de ton tableau.
2. simuler en C la généricité du C++ grâce à des macros (#define).
0
Jolkdarr
 
Pour être plus concret sur le point 2, voici un exemple :

Soit la fonction générique C++ suivante à simuler en C :
template<typename T>
T data(const T* where)
{
    return *where;
}

Avec une macro C, on pourrait écrire :
#define data2(T) T data_##T(T* where) \
{ \
    return *where; \
}

Pour l'utiliser, il faut instancier (une fois) au préalable :
/* exemple d'instanciation : */
data2(int)

/* exemple d'utilisation : */
int X = 12;
data_int(&X);


Cette technique n'est pas beaucoup utilisée par les programmeurs C. Ils préfèrent coder en C++ et ils ont bien raison ;)
À noter, la généricité est intégrée à Ada depuis 1983 et sera rajoutée à Java dans les prochains compilateurs (2005 sans doute).
0