erreur avec des char* - C - Programmation
Marsh Posté le 16-12-2006 à 19:46:12
ben, non. j'avais lu a plusieurs reprise que ce n'étais pas obligé. Et que ça n'avais jamais fait parti du standard de caster le retour du malloc....
[edit] j'avais lu ça la : http://mapage.noos.fr/emdel/notes.htm
Marsh Posté le 16-12-2006 à 22:35:02
_darkalt3_ a écrit : Tu cast pas le retour de malloc ? |
Par contre c'est pas mal de tester le retour de malloc ! Et aussi, sizeof(char) == 1 par défintion.
Je vais sans doute dire une co***rie car je n'y connais rien dans ce domaine, mais j'ai quand même l'impression que tu n'envoies pas de message car ton p->data est simplement un pointeur alloué ailleurs ,ce qui fait que tu envoies une adresse et sans doute n'importe quoi avec, mais pas le message.
Marsh Posté le 17-12-2006 à 09:53:46
Ok, merci
bon, comme tout le monde a l'air d'insister sur le fait qu'il faut mettre des cast devant le malloc je les aient rajoutés.
Sinon, en ce qui conserne mon problème je pense que tu as raison : j'utilise la memoire de mes paquets comme si elle était continue, alors que je fais deux allocations distinctes... donc j'ai remplacé mes deux allocations par ça :
Code :
|
mais le truc c'est que j'ai le droit au bon vieux segmentation fault (si cher à Linux...) au moment ou je fait ensuite le strcpy(p->data, chaine);
enfin, la je devrais trouver...
Merci
Marsh Posté le 17-12-2006 à 10:05:07
A toi de trouver à quelle adresse exacte se réfère le p->data...
A mon avis, il faut "oublier" le p->data et copier les données à un offset précis du paquet : p+4*sizeof(unsigned int) par exemple.
PS : on s'est mal compris, en C (pas en C++) le cast est déconseillé car il masque l'oubli de l'inclusion du header de déclaration de malloc.
Marsh Posté le 17-12-2006 à 10:19:06
ok, désolé. j'avais mal lu ton post : j'étais en train de penser au cast et voila...
Donc oui tu as raison, je vais tester le retour des malloc . sinon merci car maintenant j'ais plus le segmentation fault
Marsh Posté le 17-12-2006 à 11:03:26
Amonchakai a écrit : bon, comme tout le monde a l'air d'insister sur le fait qu'il faut mettre des cast devant le malloc je les aient rajoutés. |
C'est pas 'tout le monde', loin de là. Tu as eu tord...
Citation :
|
Encore faut-il déclarer la structure correctement, par exemple :
Code :
|
Marsh Posté le 17-12-2006 à 11:41:13
Salut,
tout d'abord merci de ton aide. bon, j'ai bien retiré les cast après les malloc
Mais j'avoue qu'il y a un truc qui me chagrine dans ce que tu écris : tu fais
Code :
|
et ensuite tu fais le malloc, puis la copie ?
Code :
|
ce que je comprend pas c'est que donne est un pointeur constant donc d'après ce que j'avais toujours compris on ne peut pas le faire pointer sur un autre espace mémoire déterminé par malloc...
si tu pourrais m'éclairer la dessus ça serai sympa.
Merci
Marsh Posté le 17-12-2006 à 12:05:06
Amonchakai a écrit :
et ensuite tu fais le malloc, puis la copie ? ce que je comprend pas c'est que donne est un pointeur constant donc d'après ce que j'avais toujours compris on ne peut pas le faire pointer sur un autre espace mémoire déterminé par malloc... |
Oui, c'est une possibilité un peu 'exotique' offerte indirectement par le langage qui a d'ailleurs été entérinée en C99 avec
Code :
|
L'idée, est d'utiliser une structure pour définir un bloc linéaire de longueur variable. Le début de la structure est défini, et la fin est un tableau (ici, de char). On défini une taille sans signification réelle (1 en C90, 0 en C99) qui permet simplement à la syntaxe tableau de s'appliquer pour accéder aux données. On fait ouvertement un dépassement de tableau, et on a donc intérêt à savoir ce qu'on fait, car évidemment, aucun contrôle n'est possible.
Je prends un exemple simple :
Code :
|
Marsh Posté le 17-12-2006 à 22:28:03
_darkalt3_ a écrit : Tu cast pas le retour de malloc ? |
on ne cast pas un retour de malloc en C. C'est lourd, inutile et redondant.
Et en C++, on utilise new.
Marsh Posté le 20-12-2006 à 13:50:39
jesus_christ a écrit : on ne cast pas un retour de malloc en C. C'est lourd, inutile et redondant. |
et le compilo ne te ponds pas une erreur du style
"[...] without a cast" ??
Marsh Posté le 20-12-2006 à 15:55:49
nORKy a écrit : et le compilo ne te ponds pas une erreur du style |
Pourquoi un compilateur C ferait-il ça ? En C, la conversion T* <-> void* est implicite dans les 2 sens.
Evidemment, si ce n'est pas un compilateur C, c'est un autre problème...
http://mapage.noos.fr/emdel/notes.htm#malloc
Marsh Posté le 16-12-2006 à 19:41:27
Bonjour,
pour un projet en Reseau, je dois écrire un protocole (minimaliste) pour faire communiquer des machines sur une architecture logicielle du type token-ring. Bon pour le moment j'essaie déjà avec 2 PC (enfin 2 processus sur le même PC). Voila une partie de mon code :
La structure paquet, dans laquelle je met toutes mes donnée sous forme de char*
ma méthode pour mettre les données dans le paquet :
et voila pour l'envois et la reception :
bon, le problème c'est que quand j'affiche le résultat de la fonction reception, la chaine de caractère ne s'affiche pas... (il affiche n'importe quoi...) et là ça fait quelques heures que je suis dessus et je vois pas... tout le reste fonctionne : je reçoit bien tous les autres variables de ma structure paquet mais pas la chaine... Et en plus le dialogue entre mes deux processus marche niquel. il y a juste que j'arrive pas a avoir ma chaine. (je suis quasi sur que doit manquer un +1 quelque part pour une copie, ou une allocation... je vois que que ça pourrais être que ça... mais je vois pas..) si vous avez une idée ?
Merci
Message édité par Amonchakai le 16-12-2006 à 19:44:32