Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1362 connectés 

  FORUM HardWare.fr
  Programmation
  C

  allocation dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

allocation dynamique

n°1078324
d'jo
Posté le 10-05-2005 à 18:58:38  profilanswer
 

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

mood
Publicité
Posté le 10-05-2005 à 18:58:38  profilanswer
 

n°1078329
skelter
Posté le 10-05-2005 à 19:04:40  profilanswer
 

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);

n°1078343
Sve@r
Posté le 10-05-2005 à 19:38:36  profilanswer
 

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.
n°1078568
Taz
bisounours-codeur
Posté le 10-05-2005 à 22:29:34  profilanswer
 

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

n°1078592
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-05-2005 à 22:44:06  profilanswer
 

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/
n°1080032
d'jo
Posté le 11-05-2005 à 20:09:46  profilanswer
 

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
n°1080043
skelter
Posté le 11-05-2005 à 20:14:30  profilanswer
 

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

n°1080083
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 20:44:46  profilanswer
 

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/
n°1080093
++fab
victime du syndrome IH
Posté le 11-05-2005 à 20:50:49  profilanswer
 

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.

n°1080118
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 20:57:45  profilanswer
 

++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/
mood
Publicité
Posté le 11-05-2005 à 20:57:45  profilanswer
 

n°1080138
skelter
Posté le 11-05-2005 à 21:03:15  profilanswer
 

++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

n°1080139
skelter
Posté le 11-05-2005 à 21:03:44  profilanswer
 

edit


Message édité par skelter le 11-05-2005 à 21:03:55
n°1080146
push
/dev/random
Posté le 11-05-2005 à 21:11:16  profilanswer
 

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 ?

n°1080150
skelter
Posté le 11-05-2005 à 21:16:38  profilanswer
 

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
n°1080765
++fab
victime du syndrome IH
Posté le 12-05-2005 à 13:37:21  profilanswer
 

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()

n°1085320
Taz
bisounours-codeur
Posté le 16-05-2005 à 13:01:34  profilanswer
 

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

n°1085743
matafan
Posté le 16-05-2005 à 16:53:59  profilanswer
 

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 ?

n°1085785
Taz
bisounours-codeur
Posté le 16-05-2005 à 17:13:30  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  allocation dynamique

 

Sujets relatifs
Pb allocation dynamiqueAllocation dynamique d'un tableau à 2 dimensions
[C] Allocation dynamique et recuperation de donneesallocation dynamique
allocation dynamique pour un tableau d'élémentsphp et allocation dynamique de tableau a 2 dimensions
[C] Allocation dynamique et fonction.Allocation dynamique... [pour les connaisseurs]
[C] Problèmes d'allocation dynamique ?[c] Structure et allocation de mémoire dynamique
Plus de sujets relatifs à : allocation dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR