Structure & malloc [C] - C - Programmation
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 :
|
je pense que ca devrait marcher comme ca.
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
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 :
|
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 ??)
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 =
Marsh Posté le 20-01-2005 à 18:54:13
hum bon j'essaie d'exprimer clairement mon besoin
J'ai une structure
Code :
|
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.
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)
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. |
Oui pardon c'était un pointeur (j'ai recopier une mauvaise version de test )
Pour la copie pas de problème (reflèxe php )
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() ...
Marsh Posté le 20-01-2005 à 23:18:54
ofbdood a écrit :
|
Une façon compliquée d'écrire
Code :
|
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' ?
Marsh Posté le 20-01-2005 à 23:29:44
ReplyMarsh Posté le 20-01-2005 à 23:31:36
++fab a écrit : merci, charmante |
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.
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...
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.
Marsh Posté le 21-01-2005 à 00:05:02
Emmanuel Delahaye a écrit : Une façon compliquée d'écrire
|
houlà désolé pour le "length", en plus je l'ai mis partout comme ça
Pour le "char *text", effectivement on me l'a déjà fait remarquer un peu plus haut
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)
en cas d'échec, g_malloc ferme toutes les ressources acquises, sur tout les systèmes ? Surement que oui ...
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 ?
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à
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. |
Ok.
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 ...
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.
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 :
|
A priori, ils ne font guère plus que wrapper malloc et je ne vois donc pas de quoi tu parles.
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...
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.
Marsh Posté le 22-01-2005 à 18:51:21
DocMaboul a écrit : |
Ben clairement, Taz parlait du std_try_malloc qui est une des "méthodes" de la struct GMemVTable.
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 :
|
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.
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 ...