Fonctions génériques en C et types
Bonjour à tous,
Je suis entrain d'écrire une petite bibliothèque à usage personnel contenant une structure de liste générique accompagnée de fonctions permettant diverses manipulations.
Tout d'abord voici le type tel que je l'ai défini :
Code:
1 2 3 4 5
| typedef struct Lst Lst ;
struct Lst {
void* elt ;
Lst* suivant ;
} ; |
Je cherche à écrire l'équivalent de la fonctionnelle iter du langage OCaml (qui permet d'appliquer une fonction sans retour à tous les éléments de la liste) dont voici le code tel que je l'ai écris dans ma bibliothèque :
Code:
1 2 3 4
| void iter_Lst (Lst* lst, void (*fun) (void*)) {
for (lst ; lst ; lst = lst->suivant)
(*fun) (lst->elt) ;
} |
Pour essayer je souhaite maintenant créer une liste contenant des pointeurs vers des entiers et utiliser ma précédente fonction pour en afficher les éléments un à un. Je définis donc une fonction d'affichage toute simple :
Code:
1 2 3
| void afficher (int* a) {
printf ("%d ", *a) ;
} |
Que j'appelle ensuite comme ceci :
Code:
iter_Lst (lst, &afficher) ;
Ça marche (j'ai bien le contenu de la liste qui s'affiche à l'écran) mais le compilateur (gcc) me rapporte deux avertissements :
Code:
1 2
| lst.c:71:3: attention : passing argument 2 of iter_Lst from incompatible pointer type [enabled by default]
lst.c:51:6: note: expected void (*)(void *) but argument is of type void (*)(int *) |
Je comprend ces avertissements (logique car comme j'ai décidé de faire une liste de pointeurs sur entier ma fonction d'affichage prend un pointeur sur entier) mais j'aimerai savoir si il est possible de ne plus les avoir, car tant que je respecte les types sur lesquels je travaille ma fonction marche sans encombre.
De plus, le pointeur void* étant générique pourquoi un avertissement est-il produit lorsque j'utilise un autre type ?
Merci d'avance pour vos éclaircissements...