[C] Structure & malloc

Structure & malloc [C] - C - Programmation

Marsh Posté le 20-01-2005 à 16:55:57    

Salut à tous,
 
Voilà j'essaie de créer une structure pouvant contenir un nombre indéfini d'entrées. J'utilise malloc mais j'ai comme erreur :
"`liste' undeclared"
 
Si qqun avait la solution à momn problème ...
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct liste {
  4. char text;
  5. int text_lenght;
  6. };
  7. main()
  8. {
  9.   struct liste *new_line;
  10. new_line = (liste *)malloc(sizeof(struct liste));
  11. }


 

Reply

Marsh Posté le 20-01-2005 à 16:55:57   

Reply

Marsh Posté le 20-01-2005 à 17:02:24    

salut.
Peut-etre essaye d'ajouter un nom à ta structure. Et puis le type liste n'existe pas (dans ton malloc), c'est soit "struct liste", soit "_nom_de_ta_liste" :
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct liste {
  4.     char text; 
  5.     int text_lenght;
  6. }_nom_de_ta_liste;
  7. main()
  8. {
  9.   struct liste *new_line;
  10. _nom_de_ta_liste *other_line;
  11.     new_line = (struct liste *)malloc(sizeof(struct liste));
  12.   other_line = (_nom_de_ta_liste *) malloc(sizeof(_nom_de_ta_liste));
  13. }


 
je pense que ca devrait marcher comme ca.


Message édité par allawos le 20-01-2005 à 17:03:26
Reply

Marsh Posté le 20-01-2005 à 17:10:15    

Ha ben merci c'était ça :)
 
new_line = (struct liste *)malloc(sizeof(struct liste));
 
Bon je me replonge dans mon super projet  :sweat:

Reply

Marsh Posté le 20-01-2005 à 18:15:04    

pourquoi tu veux caster ?

Reply

Marsh Posté le 20-01-2005 à 18:26:32    

un lecteur du K&R sans doute ...

Reply

Marsh Posté le 20-01-2005 à 18:30:36    

Taz a écrit :

pourquoi tu veux caster ?


 
Heing ? c'est pas bon comme ça ?
 
Sinon au passage :
 

Code :
  1. while(blablabla) {
  2.  printf("Ligne %i : ", i);
  3.  if(fgets(my_text, 255, stdin)) {
  4.   text_not_null = 1;
  5.   text_lenght = strlen(my_text) - 1;
  6.   if(text_lenght > 0) {
  7.    // On stocke la phrase
  8.    struct liste *new_line;
  9.    if(new_line = (struct liste *)malloc(sizeof(struct liste))) {
  10.     new_line->text = my_text;
  11.     new_line->text_lenght = text_lenght;
  12.    } else {
  13.     printf("ERREUR : malloc impossible" );
  14.    }
  15.   }
  16.   i++;
  17.  }
  18. }


 
J'ai fais ça, ça semble fonctionner mais je pense que je vais être bloqué par la suite.
En fait mon programme consiste à demander à l'utilisateur de rentrer plusieurs lignes de texte, moi je les stocke dans une structure avec pour chaque ligne le nombre de caractères associés.
Le problème (je pense) c'est que l'index dans ma structure va toujours être "new_line" donc un index identique pour toutes les entrées c'est pas super  :(  
Je vous demande donc conseil à ce propos quelles sont les solutions possibles ... mettre un nom de variable basé sur le "i" qui s'incrémente ?
(de plus ma structure est déclarée en dehors de toutes fonctions, ce morceaux de code est dans une fonction et impossible d'afficher le contenu de ma structure quand je suis dans le main par exemple, c'est normal ça ??)

Reply

Marsh Posté le 20-01-2005 à 18:35:46    

#    printf("Ligne %i : ", i);
#         if(fgets(my_text, 255, stdin)) {
 
 
manque un fflush entre
 
 
sinon je sais pas ou tu crois stocker je ne sais quoi, et d'ou tu sors que la copie de chaine se fait avec =

Reply

Marsh Posté le 20-01-2005 à 18:54:13    

hum bon j'essaie d'exprimer clairement mon besoin
 
J'ai une structure

Code :
  1. # struct liste {
  2. #     char text; 
  3. #     int text_lenght;
  4. # };


 
Dedans, je veux mettre une phrase ainsi que sa longueur.
Par contre effectivement je crois qu'il me manque un tableau de structure afin de pouvoir stocker plusieurs phrases ainsi que leurs longueurs associées.
 
Désolé pour les petites erreurs mais bon j'ai appris à coder avec php donc forcément il y'a des sequelles.

Reply

Marsh Posté le 20-01-2005 à 18:59:01    

Si tu veux stocker une chaine de caractères, il va te falloir un peu plus qu'un char ... un pointeur de char par exemple.
str(n)cpy pour copier des chaines (cf man)

Reply

Marsh Posté le 20-01-2005 à 19:01:53    

++fab a écrit :

Si tu veux stocker une chaine de caractères, il va te falloir un peu plus qu'un char ... un pointeur de char par exemple.
str(n)cpy pour copier des chaines (cf man)


 
Oui pardon c'était un pointeur (j'ai recopier une mauvaise version de test :p)
Pour la copie pas de problème (reflèxe php ;))

Reply

Marsh Posté le 20-01-2005 à 19:01:53   

Reply

Marsh Posté le 20-01-2005 à 21:15:58    

pitié, pas strncpy !

Reply

Marsh Posté le 20-01-2005 à 21:53:54    

ouais, faut penser à mettre le zéro terminal si la chaine source est tronquée à cause du 3eme paramètre de strncpy.
ou éviter cette tambouille en controllant la longueur de la chaine source avant d'appeler strcpy.
 
la premiere façon de faire évite quand meme un strlen() ...

Reply

Marsh Posté le 20-01-2005 à 21:54:43    

mieux vaut se trouver une implémentation de strlcpy

Reply

Marsh Posté le 20-01-2005 à 22:03:04    

qui est-ce ? tu me la présente ?

Reply

Marsh Posté le 20-01-2005 à 22:34:24    

Reply

Marsh Posté le 20-01-2005 à 23:18:54    

ofbdood a écrit :


<...>J'utilise malloc mais j'ai comme erreur :
"`liste' undeclared"

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct liste {
  4. char text;
  5. int text_lenght;
  6. };
  7. main()
  8. {
  9.   struct liste *new_line;
  10. new_line = (liste *)malloc(sizeof(struct liste));
  11. }



 
Une façon compliquée d'écrire

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct liste
  4. {
  5.    char text;
  6.    int text_length;
  7. };
  8. main()
  9. {
  10.    struct liste *new_line = malloc (sizeof *new_line);
  11.    if (new_line != NULL)
  12.    {
  13.       <...>
  14.    }
  15. }


C'était quoi la question déjà ?
 
Et c'est 'length', pas 'lenght'... Et t'es sûr que c'est pas plutôt 'char *text' ?


---------------
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 20-01-2005 à 23:29:07    

rhoo, et le int main :)

Reply

Marsh Posté le 20-01-2005 à 23:29:44    

Reply

Marsh Posté le 20-01-2005 à 23:31:36    

++fab a écrit :

merci, charmante  :ange:

franchement j'aime bien la glib. rien que les routines d'allocations qui ne renvoient pas NULL en cas d'échec ... c'est toujours de ça de moins gérer.

Reply

Marsh Posté le 20-01-2005 à 23:57:09    

Taz a écrit :

franchement j'aime bien la glib. rien que les routines d'allocations qui ne renvoient pas NULL en cas d'échec ... c'est toujours de ça de moins gérer.


Euh, il se passe quoi en cas d'echec ? Tout s'arrête ? Sympa...
 
 


---------------
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 21-01-2005 à 00:03:04    

déjà, comme y a un allocateur interne, y a plusieurs essais successifs, tentatives de récupération de mémoire dans les différents pool utilisés, etc, et puis si y a vraiment rien, ben oui, ça s'arrête. Tu sais très bien qu'il faut être réaliste : il vaut mieux que ça casse clairement, plutôt que de faire une erreur de segmentation venant d'on-ne-sait-ou. y a plein de langage à VM qui balancent une exception, faut juste vivre avec. Tant que c'est pas critique, je trouve ça correcte comme comportement. D'autant plus que ça pète aussi si on demande d'allouer un taille fantasque (genre (unsigned)-1 ça arrive ce genre de bêtise).
 
mais il existe une version g_try_malloc qui retourne NULL en cas d'échec, si on souhait détecter et gérer le problème.
 
L'important c'est avoir le choix.

Reply

Marsh Posté le 21-01-2005 à 00:05:02    

Emmanuel Delahaye a écrit :

Une façon compliquée d'écrire

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct liste
  4. {
  5.    char text;
  6.    int text_length;
  7. };
  8. main()
  9. {
  10.    struct liste *new_line = malloc (sizeof *new_line);
  11.    if (new_line != NULL)
  12.    {
  13.       <...>
  14.    }
  15. }


C'était quoi la question déjà ?
 
Et c'est 'length', pas 'lenght'... Et t'es sûr que c'est pas plutôt 'char *text' ?


 
houlà désolé pour le "length", en plus je l'ai mis partout comme ça  :pfff:  
Pour le "char *text", effectivement on me l'a déjà fait remarquer un peu plus haut :p

Reply

Marsh Posté le 21-01-2005 à 00:10:50    

Taz a écrit :

franchement j'aime bien la glib. rien que les routines d'allocations qui ne renvoient pas NULL en cas d'échec ... c'est toujours de ça de moins gérer.


 
ça fait un moment que je me dis que la glib C est surement très bien. Je suis en train de me demander dans quel contexte la lib C standard est préférable ...
Les possibilitées offertes par la glibC sont quand meme impréssionantes ! ça va plus loin que la libstdc++ (en terme de fonctionalités) :sweat:  
en cas d'échec, g_malloc ferme toutes les ressources acquises, sur tout les systèmes ? Surement que oui ...

Reply

Marsh Posté le 21-01-2005 à 04:28:33    

++fab a écrit :

en cas d'échec, g_malloc ferme toutes les ressources acquises, sur tout les systèmes ? Surement que oui ...


 
Quel est l'intéret de tout libérer proprement en cas d'erreur ?

Reply

Marsh Posté le 21-01-2005 à 07:15:00    

tout façon, c'est pas compliqué, tu regardes la valeur de ton pointeur à chaque pas et voilà

Reply

Marsh Posté le 21-01-2005 à 08:14:54    

Taz a écrit :

mais il existe une version g_try_malloc qui retourne NULL en cas d'échec, si on souhait détecter et gérer le problème.
 
L'important c'est avoir le choix.


Ok.


---------------
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 21-01-2005 à 10:28:39    

matafan a écrit :

Quel est l'intéret de tout libérer proprement en cas d'erreur ?


 
on est par exemple en train de lire et d'écrire dans un fichier. On a besoin de faire un g_malloc -> echec, le programme se termine brutalement. Le fichier est peut etre dans un état incohérent pour une future lecture.
un exemple parmi des dizaines qui me vienne en tete ...

Reply

Marsh Posté le 21-01-2005 à 11:57:46    

enfin personnellement, je n'ai jamais vu l'allocateur de la glib me jeter (sauf bug de ma part), parce que sa politique en cas de famine est assez bonne.

Reply

Marsh Posté le 21-01-2005 à 15:34:23    

Taz a écrit :

enfin personnellement, je n'ai jamais vu l'allocateur de la glib me jeter (sauf bug de ma part), parce que sa politique en cas de famine est assez bonne.


 
Ca m'intéresse et j'aimerais bien en savoir un peu plus à ce sujet. J'ai été lire le gmem.c de la dernière version et il y a un truc que je ne comprends pas:
 

Code :
  1. #ifdef SANE_MALLOC_PROTOS
  2. #  define standard_malloc malloc
  3.   /* la même pour free, realloc, ... */
  4. #else /* !SANE_MALLOC_PROTOS */
  5. static gpointer
  6. standard_malloc (gsize n_bytes)
  7. {
  8.   return malloc (n_bytes);
  9. }
  10.   /* la même pour free, realloc, ... */
  11. #endif
  12. /* --- variables --- */
  13. static GMemVTable glib_mem_vtable = {
  14.   standard_malloc,
  15.   standard_realloc,
  16.   standard_free,
  17.   standard_calloc,
  18.   standard_try_malloc,
  19.   standard_try_realloc,
  20. };
  21. /* --- functions --- */
  22. gpointer
  23. g_malloc (gulong n_bytes)
  24. {
  25.   if (n_bytes)
  26.     {
  27.       gpointer mem;
  28.       mem = glib_mem_vtable.malloc (n_bytes);
  29.       if (mem)
  30. return mem;
  31.       g_error ("%s: failed to allocate %lu bytes", G_STRLOC, n_bytes);
  32.     }
  33.   return NULL;
  34. }


 
A priori, ils ne font guère plus que wrapper malloc et je ne vois donc pas de quoi tu parles.

Reply

Marsh Posté le 22-01-2005 à 03:55:23    

De toute façon quelle que soit la façon dont la glib gère la mémoire, quand y'en a vraiment plus y'en a vraiment plus, et l'allocateur te jettera...

Reply

Marsh Posté le 22-01-2005 à 15:04:08    

le probleme, c'est pas de se faire jeter par l'allocateur.
Le probleme, c'est de se faire jeter par l'allocateur en laissant dans un état "incohérent" toutes les ressources utilisées.

Reply

Marsh Posté le 22-01-2005 à 18:51:21    

DocMaboul a écrit :


A priori, ils ne font guère plus que wrapper malloc et je ne vois donc pas de quoi tu parles.


Ben clairement, Taz parlait du std_try_malloc qui est une des "méthodes" de la struct GMemVTable.

Reply

Marsh Posté le 22-01-2005 à 20:36:02    

el muchacho a écrit :

Ben clairement, Taz parlait du std_try_malloc qui est une des "méthodes" de la struct GMemVTable.


 
Ben, clairement:
 

Code :
  1. #ifdef SANE_MALLOC_PROTOS
  2. /* ... */
  3. #  define standard_try_malloc malloc
  4. /* ... */
  5. #else
  6. static gpointer
  7. standard_malloc (gsize n_bytes)
  8. {
  9.   return malloc (n_bytes);
  10. }
  11. #define standard_try_malloc standard_malloc
  12. /* ... */
  13. #endif
  14. static GMemVTable glib_mem_vtable = {
  15.   standard_malloc,
  16.   standard_realloc,
  17.   standard_free,
  18.   standard_calloc,
  19.   standard_try_malloc,
  20.   standard_try_realloc,
  21. };
  22. gpointer
  23. g_try_malloc (gulong n_bytes)
  24. {
  25.   if (n_bytes)
  26.     return glib_mem_vtable.try_malloc (n_bytes);
  27.   else
  28.     return NULL;
  29. }


 
A mon avis, ça n'a rien à voir avec g_malloc & cie. Il parlait probablement de l'implémentation de GMemChunk et bon, en allocation à taille fixe, sans être quand même trivial, c'est tout de suite largement moins intéressant.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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