allocation dynamique

allocation dynamique - C - Programmation

Marsh Posté le 10-05-2005 à 18:58:38    

Bonjour,
Je souhaiterai pouvoir acquérir un texte de taille inconnu (grande en générale), je ne peux donc pas utiliser un tableau qui demande d'entrer une taille avant meme de la connaitre . La solution réside surement dans les pointeurs utilisés avec de l allocation dynamique mais j'avoue ne pas savoir l utiliser, je pensais faire un truc du style

Code :
  1. char *text;
  2.    
  3. // allocation
  4.     printf("\nentrez le texte  : " );
  5.     fgets (text, sizeof text, stdin);


merci

Reply

Marsh Posté le 10-05-2005 à 18:58:38   

Reply

Marsh Posté le 10-05-2005 à 19:04:40    

eu, sizeof text == sizeof(void*)
 
utilise un gros buffer ? et stocke tes lignes dans une sequence de string allouées dynamiquement
 
fputs("entrez le texte  : ", stdout);
fflush(stdout);

Reply

Marsh Posté le 10-05-2005 à 19:38:36    

Si t'es sous Linux => man getline  
Sinon, tu fais du "fgetc" en boucle en stockant le caractère dans un tableau qui s'agrandit continuellement (realloc) => dans ce cas je te conseille d'allouer par blocs de "n" octets


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-05-2005 à 22:29:34    

t'as le droit d'utilise fgets tu sais ... tant que ça termine pas par un '\n', ben tu concatène/realloc.

Reply

Marsh Posté le 10-05-2005 à 22:44:06    

d'jo a écrit :

Je souhaiterai pouvoir acquérir un texte de taille inconnu (grande en générale), je ne peux donc pas utiliser un tableau qui demande d'entrer une taille avant meme de la connaitre . La solution réside surement dans les pointeurs utilisés avec de l allocation dynamique mais j'avoue ne pas savoir l utiliser, je pensais faire un truc du style

Code :
  1. char *text;
  2.    
  3. // allocation
  4.     printf("\nentrez le texte  : " );
  5.     fgets (text, sizeof text, stdin);


merci


sizeof sur un pointeur, ça va pas le faire... Tu dois définir une taille, allouer le bloc, faire le fgets(), surveiller tes niveaux, reallouer si nécessaire... C'est pas trivial mais c'est faisable.
 
Personnellement, j'ai reglé le problème définitivement (sauf bug):
 
http://mapage.noos.fr/emdel/clib.htm
Module IO et FSTR
fonctions get_line()
 
cette fonction pend des lignes de tailles quelquonques. elle retourne l'adresse de la ligne (à libérer un jour...)
 
Pour faire un tableau de lignes automatique:
 
http://mapage.noos.fr/emdel/clib.htm
Module FARR... (Flexible ARRay) Un peu subtil (code générique), mais bien pratique aussi...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-05-2005 à 20:09:46    

Citation :

sizeof sur un pointeur, ça va pas le faire... Tu dois définir une taille, allouer le bloc, faire le fgets(), surveiller tes niveaux, reallouer si nécessaire... C'est pas trivial mais c'est faisable.


 C'est a dire avec Malloc j'alloue pour une taille N et si le texte est plus grand je reallou de N ainsi de suite ?


Message édité par d'jo le 11-05-2005 à 20:12:20
Reply

Marsh Posté le 11-05-2005 à 20:14:30    

realloue avec realloc (tu peux egalement allouer avec realloc pour simplifier le code, voir le man) et a chaque depassement de capacite realloue par bloc de N

Reply

Marsh Posté le 11-05-2005 à 20:44:46    

skelter a écrit :

realloue avec realloc (tu peux egalement allouer avec realloc pour simplifier le code, voir le man) et a chaque depassement de capacite realloue par bloc de N


Avant que le dépassement de capacité ne se produise...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-05-2005 à 20:50:49    

skelter a écrit :

realloue par bloc de N


 
Ou mieux, à la manière d'un std::vector C++, par bloc de 2N. N étant le nombre d'éléments alloué précédemment.

Reply

Marsh Posté le 11-05-2005 à 20:57:45    

++fab a écrit :

Ou mieux, à la manière d'un std::vector C++, par bloc de 2N. N étant le nombre d'éléments alloué précédemment.


http://mapage.noos.fr/emdel/clib.htm
Module IO et FSTR
fonctions get_line()
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-05-2005 à 20:57:45   

Reply

Marsh Posté le 11-05-2005 à 21:03:15    

++fab a écrit :

Ou mieux, à la manière d'un std::vector C++, par bloc de 2N. N étant le nombre d'éléments alloué précédemment.


 
ouai, moins de reallocation mais plus de perte en memoire, et realloc n'implique pas forcement copie + deplacement, mais tu as raison

Reply

Marsh Posté le 11-05-2005 à 21:03:44    

edit


Message édité par skelter le 11-05-2005 à 21:03:55
Reply

Marsh Posté le 11-05-2005 à 21:11:16    

skelter a écrit :

ouai, moins de reallocation mais plus de perte en memoire, et realloc n'implique pas forcement copie + deplacement, mais tu as raison


Tiens je me suis posé la question ya pas longtemps à propos du realloc, donc quand c'est possible un realloc ne fait pas de copie + déplacement ? même chose en C++ pour un std::vector quand c'est possible alors je suppose ? je suppose aussi que c'est dépendant de l'implémentation ?

Reply

Marsh Posté le 11-05-2005 à 21:16:38    

pour realloc c'est dis dans les specification, l'adresse retourné est celle du buffer qui peut avoir été déplacé et la strategie de reallocation de std::vector est comme ++fab l'a dis


Message édité par skelter le 11-05-2005 à 21:17:24
Reply

Marsh Posté le 12-05-2005 à 13:37:21    

push a écrit :

Tiens je me suis posé la question ya pas longtemps à propos du realloc, donc quand c'est possible un realloc ne fait pas de copie + déplacement ? même chose en C++ pour un std::vector quand c'est possible alors je suppose ? je suppose aussi que c'est dépendant de l'implémentation ?


 
En C, après un realloc, il ne faut pas s'appuyer sur le fait que parfois, il n'y aura pas copie + déplacement. Notament si tu as des pointeurs (pointants la ou tu veux réallouer) , ils peuvent etre rendu invalides suite à un realloc.
 
En C++, avec std::vector, c'est encore plus traitre. Un accroissement de std::vector (quelqu'en soit la cause) est susceptible d'invalider des itérateurs.
Pour prévoir l'accroissement d'un std::vector, tu ne peux meme pas t'appuyer (de manière totalement portable) sur la stratégie d'allocation du "2*N". --> reserve()

Reply

Marsh Posté le 16-05-2005 à 13:01:34    

normal, y a plein d'implémentation qui n'utilise pas 2 comme facteur, mais quelque chose proche du nombre d'or.

Reply

Marsh Posté le 16-05-2005 à 16:53:59    

Tiens, ca m'interesserait de savoir en quoi le nombre d'or est un bon choix. Ou alors c'est juste du au fait qu'ils font Taille[n] = Taille[n-1] + Taille[n-2] parce que c'est simple, et qu'il se trouve que le rapport Taille[n]/Taille[n-1] tend alors vers le nombre d'or ?

Reply

Marsh Posté le 16-05-2005 à 17:13:30    

Taille[n] = Taille[n-1] + Taille[n-2]
 
et hop, ça te permet d'allouer n en réutilisant les trucs précédemment alloués avec une peu de chance :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed