|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 4 ![]() |
Salut à tous !
Bon voilà j'ai un problème sur lequel je me casse la tête depuis quelques jours déjà et la date de remise du TP approche à grand pas ! Voici la consigne de mon exercice : Écrire deux programmes en C qui communiquent par le tube "tmp" crée précédemment. Le premier programme doit écrire dans le tube des nombres aléatoires entre 30 et 99 (sous forme de texte - 2 caractères). Le deuxième programme doit récupérer les nombres et écrire sur la sortie standard les caractères ASCII correspondants au codes numériques. (Note: vous pouvez utiliser les fonctions sprintf et itoa pour les conversions.) J'ai donc deux fichiers : Envoi.c : Code :
Je le suis tâté à utiliser "sprintf" pour résoudre le problème que je vais énoncer mais j'ai tout remis en com'. J'ai également reception.c permettant la réception de ces nombres : Code :
envoi.c : Code :
Code :
Je suppose que mon erreur viens du fait que j'envoi l'adresse des entiers et non les entiers eux-mêmes ... Je suppose également que la solution réside dans itoa() ou sprintf(), mais je ne vois pas du tout comment l'adapter à mon problème ! ![]() Merci d'avance de votre aide !! |
||||||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Bonjour et bienvenue,
Ton problème se situe dans l'émetteur : Si tu utilises « printf() », tes données seront envoyées vers la sortie standard, donc à l'écran. Ça marche, mais ce n'est pas du tout ce que tu veux. Pourtant, la solution avec « chaine » et « sprintf » que tu as écrite était exactement la bonne, par rapport à l'énoncé. À la place, tu choisis d'envoyer le contenu d'une variable int quitte à la transcrire de l'autre côté. Certes, mais tu continues de passer la valeur « 2 » à write, ce qui ne correspond pas, en mémoire, à la taille d'un int. Tu ne transmets donc son contenu que partiellement. Comme tu travailles probablement sur une machine en big endian (un PC), tu envoies quand même l'essentiel, mais ce ne sera pas le cas partout. Côté client, tu récupères la valeur dans un int (« buf ») mais sans l'initialiser à zéro au départ ! Sa valeur est donc indéfinie et même si tu le renseignes bien avec ce que tu reçois, comme tu ne le remplis pas, ce qui reste dedans forme au final une valeur indéfinie. La solution consiste donc à rétablir ton « sprintf, write "chaine" » du côté émetteur, à déclarer un buffer « buf » de TROIS caractères, le dernier servant au zéro final : char buf[3] = { 0,0, '\0' };, et à y déposer à chaque fois les DEUX caractères que tu lis en provenance de ton tube, sans écraser le terminateur. Tu pourras ensuite faire directement un printf("%s",buf); pour en voir le contenu. Bon courage. |
||
|
|
00
|
|
|
#3 | ||||
|
Invité régulier
![]() Étudiant Inscription : novembre 2012 Messages : 9 ![]() |
Bonjour j'ai le même problème sur mes tubes en fait je travaille sur un projet de client/serveur mais la reception des données via mon tube de retour ne me renvoi pas les mêmes données que chez le serveur comme toi Damien3193 à la place de mes donnée j'ai le droit à (null) pour chaque valeur que je demande j'ai bien vérifié la taille des données à écrire je pense qu'elle est bonne je ne vois absolument pas d'ou vient le problème pouvez vous m'aider ? merci
voici mon client.c Code :
Code :
|
||||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 4 ![]() |
Je vais tester ta solution, je n'ai pas le temps aujourd'hui mais sans doute demain !
Merci de votre aide ^^ |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2012 Messages : 9 ![]() |
Pour ceux qui auront le même problème la provenance de cette erreur est que dans ma structure de retour j'utilisais des pointeurs qui n'étais ce qui provoquait des erreurs d'adressage à la sortie du tube je suppose et ma solution aura été de transformer mes variables de type passwd* en tableau de char et ça marche niquel ! a bientôt
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com