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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
void afficher (int* a) {
  printf ("%d ", *a) ;
}
Que j'appelle ensuite comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...