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

  FORUM HardWare.fr
  Programmation
  C

  [C] Structure & malloc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Structure & malloc

n°957623
ofbdood
Posté le 20-01-2005 à 16:55:57  profilanswer
 

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. }


 

mood
Publicité
Posté le 20-01-2005 à 16:55:57  profilanswer
 

n°957630
allawos
Posté le 20-01-2005 à 17:02:24  profilanswer
 

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
n°957645
ofbdood
Posté le 20-01-2005 à 17:10:15  profilanswer
 

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

n°957714
Taz
bisounours-codeur
Posté le 20-01-2005 à 18:15:04  profilanswer
 

pourquoi tu veux caster ?

n°957721
++fab
victime du syndrome IH
Posté le 20-01-2005 à 18:26:32  profilanswer
 

un lecteur du K&R sans doute ...

n°957725
ofbdood
Posté le 20-01-2005 à 18:30:36  profilanswer
 

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

n°957727
Taz
bisounours-codeur
Posté le 20-01-2005 à 18:35:46  profilanswer
 

#    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 =

n°957732
ofbdood
Posté le 20-01-2005 à 18:54:13  profilanswer
 

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.

n°957735
++fab
victime du syndrome IH
Posté le 20-01-2005 à 18:59:01  profilanswer
 

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)

n°957737
ofbdood
Posté le 20-01-2005 à 19:01:53  profilanswer
 

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

mood
Publicité
Posté le 20-01-2005 à 19:01:53  profilanswer
 

n°957869
Taz
bisounours-codeur
Posté le 20-01-2005 à 21:15:58  profilanswer
 

pitié, pas strncpy !

n°957923
++fab
victime du syndrome IH
Posté le 20-01-2005 à 21:53:54  profilanswer
 

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

n°957924
Taz
bisounours-codeur
Posté le 20-01-2005 à 21:54:43  profilanswer
 

mieux vaut se trouver une implémentation de strlcpy

n°957942
++fab
victime du syndrome IH
Posté le 20-01-2005 à 22:03:04  profilanswer
 

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

n°957984
Taz
bisounours-codeur
Posté le 20-01-2005 à 22:34:24  profilanswer
 
n°958047
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-01-2005 à 23:18:54  profilanswer
 

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/
n°958057
Taz
bisounours-codeur
Posté le 20-01-2005 à 23:29:07  profilanswer
 

rhoo, et le int main :)

n°958058
++fab
victime du syndrome IH
Posté le 20-01-2005 à 23:29:44  profilanswer
 
n°958059
Taz
bisounours-codeur
Posté le 20-01-2005 à 23:31:36  profilanswer
 

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

n°958089
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-01-2005 à 23:57:09  profilanswer
 

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/
n°958093
Taz
bisounours-codeur
Posté le 21-01-2005 à 00:03:04  profilanswer
 

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.

n°958095
ofbdood
Posté le 21-01-2005 à 00:05:02  profilanswer
 

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

n°958101
++fab
victime du syndrome IH
Posté le 21-01-2005 à 00:10:50  profilanswer
 

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

n°958198
matafan
Posté le 21-01-2005 à 04:28:33  profilanswer
 

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

n°958202
Taz
bisounours-codeur
Posté le 21-01-2005 à 07:15:00  profilanswer
 

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

n°958212
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-01-2005 à 08:14:54  profilanswer
 

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/
n°958263
++fab
victime du syndrome IH
Posté le 21-01-2005 à 10:28:39  profilanswer
 

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

n°958325
Taz
bisounours-codeur
Posté le 21-01-2005 à 11:57:46  profilanswer
 

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.

n°958581
docmaboul
Posté le 21-01-2005 à 15:34:23  profilanswer
 

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.

n°959118
matafan
Posté le 22-01-2005 à 03:55:23  profilanswer
 

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

n°959279
++fab
victime du syndrome IH
Posté le 22-01-2005 à 15:04:08  profilanswer
 

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.

n°959389
el muchach​o
Comfortably Numb
Posté le 22-01-2005 à 18:51:21  profilanswer
 

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.

n°959453
docmaboul
Posté le 22-01-2005 à 20:36:02  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


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

  [C] Structure & malloc

 

Sujets relatifs
tri multicriteres sur structure dans liste chianée[yacc] problème de structure
Pbs structure en liste chainée et manip de fichierEnregistrer dans un fichier un tableau de structure
Structure d'un fichier MP3structure
Structure en forme de tableaustructure du fichier xm
structure répétition en vb.net, etudiant newbeepb pour passer un structure avec le protocole XDR
Plus de sujets relatifs à : [C] Structure & malloc


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