Téléchargement
illégal
Posez votre question Signaler

Réallocation dynamique qui ne marche pas? [Résolu]

Mr zlem 18Messages postés 1 août 2011Date d'inscription 6 mai 2012Dernière intervention - Dernière réponse le 19 oct. 2011 à 08:07
Bonjour,
Je suis sur un code qui rempli un tableau (dynamique) avec des valeur entré par un utilisateur.
On suppose que l'utilisateur rentre plein de valeurs(genre des milliers).
Je ne sais donc pas la taille que va faire mon tableau c'est pourquoi il est dynamique.
J'utilise donc une boucle pour demander à l'utilisateur de rentrez sa valeur et j'agrandis mon tableau pour ajouter cette valeur.
Le problème c'est que je n'arrive pas à ré-allouer une 2 em fois, mon tableau.
La première fois ça marche mais pas la 2em. D'ailleurs 2em fois l'adresse de mon tableau vaux NULL. C'est très embêtant car mon tableau est perdu au moindre problème avec la fonction realloc.
Je vous donne un résumé de se que je veux faire; c'est du langage C :
/*initalisation tableau, malloc OK*/
taille=0;
do{
/*saisie utilisateur*/
tableau = realloc(tableau, sizeof(int) * taille);
tableau[taille];
taille++;
}while(/*fin de saisie*/);
Y a t'il une autre solution?
Lire la suite 

Réallocation dynamique qui ne marche pas »

12 réponses
Réponse
+1
moins plus
Tu peux par exemple construire un premier tableau de taille 101.
Si tu as remplis tes 100 cases, tu mets dans la 101è case un pointeur vers un nouveau tableau qui sera par de taille 1001, et dont la 1001è case pourra encore être un tableau...

Si tu cherches la valeur 995, tu vas regarder la case 101 pour te déplacer sur le tableau et ensuite aller à la case 895.

C'est une façon parmi d'autres ;-)
Ajouter un commentaire
Réponse
+1
moins plus
http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/realloc.3.txt.html
il est préciser que le pointeur est conservé si realloc échoue.
Donc :
int* tmp;
...
tmp=realloc(tableau,sizeof(int)*taille);
if(tmp!=0) tableau=tmp;

ainsi tu conserve tes données en cas d'échec, mais attention à la taille. Tu peux aussi regarder la valeur de errno en cas d'échec pour voir ce qui cloche.
La solution de KX me parait assez compliqué à réaliser. Mais à la rigueur, je la conserverait mais lui donnerai une forme de liste chainée:
struct liste
{
  int taille;// taille réelle occupée
  struct liste* suivant;
  int tableau[100];
}
Ensuite, tu fais des fonctions pour remplir cette liste et accéder à un élément.
Ajouter un commentaire
Réponse
+0
moins plus
Salut ...

C'est plus pratique d'utiliser les listes chaînés ... en gros, tu utilisera juste l'espace dont t'aura besoin, et non pas créer des tableaux au hasard et de tailles maximum, et que probablement l'utilisateur n'utiliserait même pas ...

a+

JooS- 18 oct. 2011 à 19:23
ah, j'avais pas vu le code de CharSniper ...

Mais en gros ça reste une liste(des tableaux) chaînée ...

...liste chaînée contre 9 pour celle de CharSniper ...
hmmm, je sais pas vraiment, je me documenterai la dessus ... :)
Mais mon point de vue actuel : même le tableau contient des adresses, et les lignes restent accessibles grâces au adresses, donc y a pas de différences, appart que les adresses des lignes du tableau sont suivies alors que c'est pas forcement le cas avec les listes chaînées ... mais bon, il faudrait un tableau de plusieurs millions de lignes(maillons) pour ressentir une différence de quelques millisecondes ...
KX- 18 oct. 2011 à 19:35
En fait il faudrait 10 étapes, j'avais mal compté.
Quand tu es sur le maillon (0-99) de départ tu vas sur le maillon suivant (100-199) en 1 étape, et tu continues jusqu'à l'étape 9 et le maillon (900-999) et là le fait que les cases d'un tableau se suivent, te permet d'aller directement à n'importe quelle case du tableau donc à l'étape 10 tu as la valeur de 995.
Avoir un tableau de plusieurs millions de lignes est loin d'être totalement irréaliste, et quelques millisecondes de différence pour la lecture d'un élément c'est énorme si tu fais des millions d'accès ! Mais dans ce cas on n'utilise plus des listes chaînées...
Char Snipeur- 19 oct. 2011 à 08:07
Tout serait tellement plus simple avec la STL en C++.
Ajouter un commentaire
Réponse
+0
moins plus
Merci, pour ces solutions je vais les tenter.
Ajouter un commentaire
Ce document intitulé « Réallocation dynamique qui ne marche pas? » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?