Tableau de structure dynamique ?

cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006 - 30 mars 2005 à 20:59
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006 - 31 mars 2005 à 17:29
Bonjour,
J'aimerai faire un tableau de structure dynamique mais je galère.
Pour un tableau de int dynamique c'est bon. ex :

int * pTabInt;
int * tmp = NULL;
int iIndex;

for(iIndex = 0; iIndex < 15; iIndex++)
{
if(iIndex == 0)
{
pTabInt = (int*) malloc (sizeof (int));

if(pTabInt == NULL)
{
printf("Echec lors de l'allocation de mémoire ! (malloc)\n");
}

*(pTabInt + iIndex) = iIndex+ 2; // par exemple
}
else
{
tmp = (int*) realloc (pTabInt, (sizeof (int)));

if(tmp == NULL)
{
printf("Echec lors de l'allocation de mémoire ! (realloc)\n");
}

pTabInt= tmp;
*(pTabInt + iIndex) = iIndex + 2;

int * tmp = NULL;
}
}

J'accède ensuite aux éléments du tableau comme ça. ex :
*(pTabInt + 5) ;

Par contre si je veux faire pareil avec une structure genre :

struct Buffer
{
int iEntier;
float fFlottant;
double dDouble;
};
struct Buffer * pTabStrc;
struct Buffer * tmp = NULL;

for(iIndex = 0; iIndex < 15; iIndex++)
{
if(iIndex == 0)
{
pTabStrc = (struct Buffer*) malloc (sizeof (struct Buffer));

if(pTabStrc == NULL)
{
printf("Echec lors de l'allocation de mémoire ! (malloc)\n");
}

*(pTabStrc + iIndex).iEntier = iIndex+ 2;
}
else
{
tmp = (struct Buffer*) realloc (pTabStrc, (sizeof (struct Buffer)));

if(tmp == NULL)
{
printf("Echec lors de l'allocation de mémoire ! (realloc)\n");
}

pTabStrc= tmp;
*(pTabStrc + iIndex).iEntier = iIndex + 2;

int * tmp = NULL;
}
}

*(pTabStrc + 5) .iEntier;

Là, le compilo me dit que j'essaie d'accéder à une valeur qui n'est pas une sructure ou qq chose comme ça.
Bref, est ce que qqu'un pourrait me dire si il est possible de faire ce genre de tableau, et si
oui, quelle est la bonne syntaxe ?

Note: Je ne veux pas faire de liste chainée, je préférerai le principe du tableau dynamique.

Tintin 72

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 mars 2005 à 22:08
typedef struct _MYBUF {
long val;
} MYBUF, *LPMYBUB;

LPMYBUB pbuf;

pbuf = (LPMYBUB) malloc(sizeof(MYBUF) * 10); // 10 structures

pbuf[0].val = 0;

ciao...
BruNews, MVP VC++
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
30 mars 2005 à 22:12
Utilises l'opérateur []



*(pTabInt + iIndex) = iIndex + 2; ->
pTabInt[ iIndex] = iIndex + 2;




(*(pTabStrc + iIndex)).iEntier = iIndex + 2;

ou


(pTabStrc + iIndex)->iEntier = iIndex + 2; ->
pTabStrc[ iIndex].iEntier = iIndex + 2;
0
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
31 mars 2005 à 09:32
Merci pour vos réponses, maintenant ça fonctionne ;-)
Toutefois, je viens de me rendre compte d'un autre problème.
Par exemple pour le tableau de int dynamique (voir plus haut), lorsque l'incrémentation de la boucle dépasse 23, le programme plante en disant que la mémoire ne peut être "writen" blablabla.
J'ai pensé à un pb avec la fonction realloc mais je suis pas sûr.
Est ce que vous auriez une idée ?

Tintin 72
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
31 mars 2005 à 11:31
La méthode que tu as mise plus haut n'alloue aboluement pas un tableau d'entier, tu ne fait que réallouer un entier à chage fois (malloc et realloc (pTabInt, (sizeof (int)));)
et que tu stocke dans
pTabInt.
Donc quand tu veux accéder à un élément autre que
pTabInt[0]
tu tape à un endroit non alloué de la mémoire et donc plantage assuré au bout d'un moment.

La bonne méthode pour allouer un tableau d'entier (ou d'autre chose)
int size = 12
TRUC* p = malloc(12*sizeof(TRUC));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
31 mars 2005 à 13:06
OK, merci pour ton explication. Mais, pourrais tu me dire alors, comment
faire un tableau (de int par ex) vraiment dynamique, (cad dont on ne connaît
absolument pas la taille au départ), et auquel on peut allouer des éléments
au fur et à mesure selon les besoins lors de l'exécution du programme.
Tu vas certainement me parler des listes chainées, mais je voudrais garder
le concepte du tableau (qui je crois est plus rapide lors du listage).

Merci

Tintin 72
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
31 mars 2005 à 14:19
Pour la première allocation :
TRUC* p = malloc(12*sizeof(TRUC));

pour les suivantes : p realloc(p, 13*sizeof(TRUC));> le contenu précédent est conservé (vérifier quand même le retour pour éviter de perdre p si NULL).
0
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
31 mars 2005 à 15:14
J'ai adapté ton exemple dans la boucle de tableau de int (plus haut) mais le programme plante toujours avec la même erreur (la mémoire ne peut être "writen" blablabla).

Je ne comprends pas non plus pourquoi tu alloue 12 TRUC dès la 1ere allocation, un seul suffit non ?

Tintin 72
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
31 mars 2005 à 15:18
J'ai mis 12 mais tu met ce que tu veux.
Autant allouer dès le nombre voulu pur faire ta boucle d'init (15, 23, on s'en fout).
Ensuite dans ton prog si tu te rend compte qu'il en fallait plus, tu fais un realloc.

int * pTabInt;
int iIndex;
pTabInt = malloc(15*sizeof(int));
for(iIndex = 0; iIndex < 15; iIndex++)
pTabInt[iIndex] = iIndex*2+5;

...
pTabInt = realloc(pTabInt, 75*sizeof(int));

pTabInt[74] = 1234;
0
cs_tintin72 Messages postés 122 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 22 juillet 2006
31 mars 2005 à 17:29
OK, j'ai trouvé pourquoi ça plantait.
En fait je n'allouais pas assez de mémoire pour realloc tout simplement :-)

Merci pour ton aide

Tintin 72
0
Rejoignez-nous