Creation d'un tableau de taille augmentant a chaque iteration d'une boucle

cs_rom12 Messages postés 3 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 23 août 2004 - 23 août 2004 à 08:32
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 24 août 2004 à 19:46
Salut,
J'ai besoin de creer un tableau de taille variable... dt la taille n'est pas connue d'avance (d'ou le pb avec malloc).
En fait, j'ai une boucle qui calcule des distances entre des chaines de caracteres, et chaque fois qu'on tombe sur une distance inferieure a un seuil, je veux stocker le resultat ds un tableau de resultats... mais je ne peux pas creer un tableau de taille fixe car il risque de bouffer trop de memoire pour pas grand chose et avec malloc je suis oblige de connaitre le nombre de resultats a l'avance pour alloer la memeoire...
Si qq1 a une idee, ca m'aiderai bien ;)
A+
Rom1 (#2 puisqu' y a deja un #1)

33 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 août 2004 à 08:54
utilise une liste ou alloue ton tableau a une taille maximale pouvant etre atteinte et resize (realloc) apres la boucle
0
cs_rom12 Messages postés 3 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 23 août 2004
23 août 2004 à 08:58
comment je fais avec une liste?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 août 2004 à 09:41
en gros

typedef struct _list
{
int value;

struct _list *next;
struct _list *cur;
struct _list *prev;

} List;

List liste;

liste.prev = NULL;
liste.cur = &liste;

for( ... )
{
liste.cur->value = ...

liste.cur->next = malloc( sizeof *liste );
liste.cur->next->prev = liste.cur;
liste.cur = liste.cur->next;
}

mais c'est a verifier
0
cs_rom12 Messages postés 3 Date d'inscription mercredi 26 mai 2004 Statut Membre Dernière intervention 23 août 2004
23 août 2004 à 09:47
merci, je v essayer de suite.
0

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

Posez votre question
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
23 août 2004 à 10:25
Salut,

Jette aussi un oeil sur le template vector dans la STL...

A+,
JP.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 août 2004 à 10:51
deja une rectif

liste.cur->next = malloc( sizeof liste ); au lieu de
liste.cur->next = malloc( sizeof *liste );
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 14:30
et si tu es en C (et que dc tu n'as pas les vectors), tu peux les réecrire grossièrement pou le type pour lequel tu as besoin de faire ca (voila en gros ce qu'il faut faire)

struct vector
{
int taille;
int capacite;
type * tableau [];
}

ensuite tu fais tes fonctions qui soient telles que tu puisse ajouter un élement au tableau, ce qui va augmenter la taille du tableau, et si besoin la capacité. pour augmenter la capacité, déclare un tableau de capacité + 8 (en c++ pour les vectors les granules mémoires sont de 8, je suppose dc ke cest intelligement choisi), recopie l'ancien tableau, ds ce nouveau tableau, free l'autre, et réalloue ton pointeur sur ce nouveau tableau. ensuite fait les fonctions de bases dont tu auras besoin, genre accesseur etc.... ca sera pas forcement tres tres propre ds l'ecriture, mais ca sera simple d'utilisation, et si ton tableau doit devenir tres gros au final, ca bouffera moins de memoire qu'une liste. et les performances seront probablement meilleures.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 18:12
avec realloc, comme l'ont dit les autres, je n'en ai po trouvé d'équivalent si on utilise les new....

exemple de liste gérées ainsi : BListeDir & BListeIndir
et les stl, bien sur

++
Magic Nono: l'informagicien! 8-)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:15
l'equivalent reallloc en c++ c'est std::vector

en c++, pour les listes, utilise std::vector ou std::list
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:24
leprov > il me semble que les vector sont implementer sous formes de cellules liées, justement pour ne pas avoir a faire ssytemetiquement des recopie de buffer (ca peut etre le probleme de realloc)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 18:28
bah t'évite les recopie de buffer dans ce cas, d'accord, mais tu perd du temps a tous les accès a reparcourir a partir d'un élement (courant ou dernier ou premier, va savoir).....ca serais un compromis.
donc on a une taille et une capacité avec des ganules memoires de 8 pour ne faire des realloc que tous les 8 ajouts d'élément, c'est a ca que sert la capacité, et a ca que sevent les granules. enfin du moins il me semble, je peux aussi me tromper....(je sais pas si ce que j'ai dis est tres clait pr tt le monde, j'espere...).
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:32
ta raison faut verifier ca en profondeur

juste que dans ce cas la

for( /* 2500000 iteration */ ) v.push_back( ... );

tu imagines le nombre de copies ?

au niveaux des acces, pas la peine de caché que vector est bien plus long qu'un tableau
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 18:36
bah ca fait 2 500 000/8 copies, et si tu veux accéder au dernier élément du tableau il faudrait que tu parcours tte ta liste, alors que ds le cas d'un tableau c'est uniquement un décalage d'adresses. c'est vrai que les 2 idées se défendent, mais explique moi l'utilité de la capacité si on a une liste......et pr les strings ca serait des listes aussi? non, moi il me semble bien que c'est des tableaux
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
24 août 2004 à 18:36
ouep, G failli répondre que GT po convaincu au niveau perf.... & facilité....

Magic Nono: l'informagicien! 8-)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:41
pas forcement comme une liste, je verifie
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 18:42
et ds le cas que tu propose, t'imagine le temps de libération de la mémoire? c'est encore une fois le tableau le plus rapide des deux....
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 18:49
et pense aux iterators. lorsque la capacité est modifiée, tous les iterators déja existants sont invalidés....pourquoi? parce que la tableau a changé de "position" en mémoire.....si tu avais une liste, les itérators ne seraient pas invalidés
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:50
ouai j'imagine

en fait ta raison, c'est bien un buffer ou les données son contigues, le buffer à une capacité max et size inferieur, et seul les elements < size sont construit, quand on push_back ca appel le constructeur du suivant
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:52
le probleme c'est que c'est pas facile à lire comme hierarchie de classe
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 août 2004 à 18:56
ca n'empeche que le schmilblick rend les accés trop long, d'ailleur c'est spécifié
"Use STL to build containers when number of objects is unknown; use static array or buffer when number is known"
0
Rejoignez-nous