Dereferencing "void *" pointer

Résolu
calimero33160 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -  
calimero33160 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   28
 
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   Statut Membre Dernière intervention  
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention  
 
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