Bonjour à tous et toutes.
Alors voilà, j'aimerais faire une fonction qui me permettrait de créer une liste chaînée pouvant contenir au choix, des int, des char, des doubles etc...
Pour faire ça, j'avais pensé à une structure ressemblant à ça :
"elemsize" me sert à savoir quelle place prends l'élément en mémoire. Donc en gros, si je lui envoie "salut" il vaut 6 et si je lui envoi 5.5 il vaut 8.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct s_chain { void *elem; size_t elemsize; struct s_chain *next; }t_chain;
Ensuite, pour la fonction créant un nouveau maillon, je pensais à quelque chose comme ça :
Mais je vais avoir quelques soucis, le premier c'est que mon programme ne compilera pas puisque si j'envoie un char à ma fonction, elle me dira que ce n'est pas un "void *", donc il faudra que j'envoie "&variable" à ma fonction, mais du coup, si je modifie ma variable, je modifierais dans le même temps la variable de ma liste chaînée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 t_chain *newlist(void *elem, size_t elemsize) { t_chain *new; new = malloc(sizeof(t_chain)); new->elem = elem; new->elemsize = elemsize; new->next = NULL; return (new); }
Donc il faut que je fasse un cast, et c'est mon deuxième problème, comment cast alors que je ne connais pas le type ? J'avais pensé à faire une fonction à part, qui ferrait un memalloc et un memcpy de mon "elem" grâce à mon "elemsize" mais je me demande si ça serait viable ?
De toute on en arrive au troisième problème, lorsque j'essaierais d'afficher mon elem, on me demandera "" quel type veut-tu afficher ?". Donc si je fais un :
J'aurais une erreur me disant que printf attends un "int" et non un "void *".
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%d\n", begin->elem)
Donc si vous avez des idée/conseils pour m'aider à faire progresser le shmilblik, je suis preneur. D'autant plus que j'ai grand mal encore à gérer les types "void" et que je suis sûr que ce genre d'exercice peut m'aider à mieux les appréhender.
Merci du temps passé à lire ce message jusqu'au bout, et du temps que vous prendrez pour m'aider.
PS : Désolé pour l'indentation, mais apparement, ma touche tab ne fonctionne pas sur le forume .
Partager