Sur ton code qui fonctionne :
#define len(t) ( sizeof(t) / sizeof([0]) )
devrait être
#define len(t) ( sizeof(t) / sizeof(t[0]) )
mais il ne s'agit sans doute que d'une erreur de recopie (il est préférable de faire un copier coller que de recopier le code)
printf("i : %d\n%x\n", i, *(t+i));
s'écrit aussi avantageusement
printf("i : %d\n%x\n", i, t[i]);
puisque par définition de l'opérateur [], *(t+i) est équivalent à t[i]
....sinon j'aurais vu l'histoire des pointeurs génériques, toutefois, je n'arrive pas pour autant à me servir de ces pointeur génériques en tant qu'argument lors de la définition de la fonction...
La difficulté de passer un paramètre du type void * est lié au fait que pour utiliser les données, il faut des informations complémentaires sur le type exact. On peut distinguer deux cas :
- la fonction n'a besoin pour travailler que de connaitre la taille d'un élément. On peut alors la passer en argument de la fonction. C'est par exemple le cas de la fonction standard de tri qsort() : les opérations impliquées sur les éléments du tableau par le tri demandent de situer les éléments du tableau et de pouvoir les déplacer. Le paramètre void* permet d'obtenir l'adresse du début du tableau et la taille des éléments permet de trouver la position du ieme élément du tableau. On n'a pas besoin d'en savoir plus sur le type des éléments du tableau.
- La fonction a besoin de connaitre le type exact, par exemple si elle effectue des opérations sur les éléments du tableau (y compris l'affichage), autrement dit demandent d'utiliser p[i] ou *(p+i). Alors, l'utilisation du void * perd beaucoup de son intérêt, puisqu'il faut passer un indicateur du type exact des éléments du tableau et traiter chaque cas dans un gros switch sur cet indicateur. Ceci n'améliore pas forcément le code, mais a alors le seul intérêt de le "centraliser" dans une fonction.
Dans le code de ta fonction showE, tu n'essayes pas d'afficher un élément du tableau dont le type est inconnu (sinon que mettre dans le printf ? %d, %f , ...), mais l'adresse de son dernier élément.
int ad = ( p+((n-1)*size) );
est incorrect : le second membre est une adresse de type char * et ad est un int : une adresse n'est pas un entier
return *( p+((n-1)*size) );
Non, le type de retour est void * soit une adresse. Or *( p+((n-1)*size) ) est du type char. Tu essayes cette fois de convertir un entier (char) en une adresse (void *) . Une adresse n'est pas un entier
Partager