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 :
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
5 typedef struct Lst Lst ; struct Lst { void* elt ; Lst* suivant ; } ;
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
4 void iter_Lst (Lst* lst, void (*fun) (void*)) { for (lst ; lst ; lst = lst->suivant) (*fun) (lst->elt) ; }
Que j'appelle ensuite comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void afficher (int* a) { printf ("%d ", *a) ; }
Ç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 iter_Lst (lst, &afficher) ;
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.
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 *)’
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...
Partager