probleme d'allocation dynamique
Bonjour a tout le monde!!
J'ai un petit probleme....
Voila un bout de code:
mon_code.h
Code:
1 2 3 4
|
...
typedef struct toto *toto;
... |
mon_code.c
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
struct toto
{
int mon_champ;
};
...
void ma_fonction(void)
{
int i_alloc;
toto = malloc(255 * sizeof (toto));
for (i_alloc = 0; i_alloc < 255; i_alloc++)
toto[i_alloc] = malloc(sizeof (toto));
.... |
Et quand je veux acceder a un des champs de ma structure, je fais par exemple:
Code:
1 2
|
fscanf(mon_fichier,"%d\n", &toto[i]->mon_champ); |
A la compilation, il me dit " incompatible types in assignment" a la ligne a l'interieur du for...
Merci de votre aide...
Re: probleme d'allocation dynamique
Citation:
Envoyé par vince3320
mon_code.h
Code:
1 2 3 4
|
...
typedef struct toto *toto;
... |
Si tu peux éviter les 'toto', ça a le don de m'énerver...
D'autre part, c'est pas une bonne idée de mettre une '*' dans un typedef. On ne connait plus la nature du type des objets de ce type. Il n'y a aucune honte à manipuler des pointeurs. Il ne faut pas les cacher. Je recommande que les types structures soient suffixés par 's', et que les objets pointeurs soient préfixés par 'p_'.
Citation:
mon_code.c
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
struct toto
{
int mon_champ;
};
...
void ma_fonction(void)
{
int i_alloc;
toto = malloc(255 * sizeof (toto));
for (i_alloc = 0; i_alloc < 255; i_alloc++)
toto[i_alloc] = malloc(sizeof (toto));
.... |
'toto' n'est pas un objet, c'est un type.
Et quand je veux acceder a un des champs de ma structure, je fais par exemple:
Code:
1 2
|
fscanf(mon_fichier,"%d\n", &toto[i]->mon_champ); |
A la compilation, il me dit " incompatible types in assignment" a la ligne a l'interieur du for...
Normal, vu de l'extérieur, la structure est opaque. On ne peut pas accéder à ses champs. Il faut une fonction 'accesseur'.
Re: probleme d'allocation dynamique
Citation:
Envoyé par Emmanuel Delahaye
Citation:
Envoyé par vince3320
mon_code.h
Code:
1 2 3 4
|
...
typedef struct toto *toto;
... |
Si tu peux éviter les 'toto', ça a le don de m'énerver...
D'autre part, c'est pas une bonne idée de mettre une '*' dans un typedef. On ne connait plus la nature du type des objets de ce type. Il n'y a aucune honte à manipuler des pointeurs. Il ne faut pas les cacher. Je recommande que les types structures soient suffixés par 's', et que les objets pointeurs soient préfixés par 'p_'.
plus que le nom toto, ou le fait qu'il y ait une étoile dans un typedef, cette ligne presente une ambiguité terrible :
toto designe un pointeur sur struct toto
du coup la ligne
Code:
1 2
|
toto = malloc(255 * sizeof (toto)); |
une erreur
Code:
1 2
|
toto* titi = malloc(255 * sizeof (toto) |
puis ensuite
Code:
1 2
|
toto[i_alloc] = malloc(sizeof (toto)); |
deviens
Code:
1 2
|
titi[i_alloc] = malloc(sizeof (struct toto)); |
en enfin
mais evidement le mieux serait de donner des noms differents à la structure et au pointeur sur la structure...