Creation d'un tableau de taille augmentant a chaque iteration d'une boucle
cs_rom12
Messages postés3Date d'inscriptionmercredi 26 mai 2004StatutMembreDernière intervention23 août 2004
-
23 août 2004 à 08:32
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 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)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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...).
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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"