Dereferencing "void *" pointer

Résolu/Fermé
calimero33160 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 avril 2012 - 15 avril 2012 à 00:24
calimero33160 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 avril 2012 - 16 avril 2012 à 16:48
Bonjour,

J'ai un problème de programmation en langage C, au sujet des pointeurs génériques.

J'ai en fait plusieurs types de structure (poisson, obstacle, nourriture et prédateur), et je souhaite créer un tableau de pointeurs référençant ces différents types d'objet (c'est un tableau à deux dimensions, du type "tableau [] []"). Le problème c'est qu'en C, il ne me semble pas que l'on puisse faire de tableau contenant des variables de type mixte. Je me suis donc orienté vers le pointeur générique "void *".

Je déclare donc mon tableau : void* tab[taille1][taille2];

Ensuite je le remplis avec des pointeurs :
tab[0][0]=creerPoisson(); (fonction qui renvoie un pointeur sur poisson)
tab[0][1]=creerObstacle();
etc, bref je remplis le tableau (certaines cases restent vides, donc NULL ;-) )

Ensuite je souhaite parcourir le tableau et savoir à quoi correspond chaque pointeur, sachant que chacune de mes structures possède un champ 'int type' d'une valeur de 0,1,2 ou 3 en fonction du type.

J'ai donc tenté de bêtement caster en n'importe quoi, du style if((poisson)t[i][j]->type==0), mais je me prends une erreur style "dereferencing 'void*' pointer".

Je tente donc avec tous les cast possibles (predateur, poisson, obstacle et nourriture), mais aucun ne semble vouloir fonctionner
Donc je demande votre aide, sachant que je ne suis pas extrêmement compétent en C ^^

Merci d'avance !

4 réponses

p3t3r42 Messages postés 74 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 2 février 2014 28
15 avril 2012 à 21:57
Bonjour,
En C, il me semble que les pointeurs dans ton tableau ne se mettent pas à NULL automatiquement, il est peut etre alors nécessaire de faire une (double) boucle for pour l'initialiser.

Etant donné que il s'agit de pointeur ne faudrait-il pas faire plutôt :
if((poisson*)t[i][j]->type==0)
0
calimero33160 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 avril 2012
15 avril 2012 à 22:29
Bonjour,
Tout d'abord merci de t'intéresser à mon problème.

J'ai malheureusement déjà une double boucle for qui initialise le tableau à NULL !

Mes structures sont en fait définies de cette manière :

typedef struct{
blablabla
}*poisson;

donc il ne me semble pas que je doive faire un cast en (poisson*), car (poisson) est déjà un pointeur...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
16 avril 2012 à 09:42
Salut.
Je ne vois pas de raison pour laquelle tu ne pourrai pas dereferencer un void*, c'est fait assez souvent.
Essai en protégeant avec des parenthèses :
((poisson)tab[0][0])->type;
0
calimero33160 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 18 avril 2012
16 avril 2012 à 16:48
Merci beaucoup, je n'avais pas fait gaffe à l'ordre de priorité entre -> et le cast en (poisson), j'ai donc rajouté des parenthèses comme tu me l'as dit, et ça fonctionne parfaitement :-)
0