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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C/C++] Copier un char* dans un char*? pas resolu-C'est pour ce soir:/

n°238111
Tetedeienc​h
Head Of God
Posté le 31-10-2002 à 18:16:40  profilanswer
 

Reprise du message précédent :

BENB a écrit a écrit :

 :D  :D  :D ...
 
Il est pas si mal ton code...
 
Si tu veux j'en ai ici  :sarcastic:  personne ne sait en quel langue sont les commentaires... mais c'est pas tres grave... il n'y en pas bcp  :sarcastic:  
 
Effectivment sa parait bon...  il sagirait alors d'un effet de bord, et sans un purify ou un debugger c'est difficile...
 
tu es sous linux, tu n'as pas ddd ?
 
debugger une lib c'est comme un executable, mais il faut un executable de test... ca tombe bien tu l'as ;)
 
au pire fait des printf a plusieurs niveaux, dans le main y compris...
 
surveilles bien ce qui se passe lors de l'appel de la fonction...
 
 




 
Ben c'est ce que je fais, et je trouve rien de bizarre...
 
sauf que je peux pas acceder a la variable essai depuis la fonction de la librairie...
 
ddd je l'ai, mais le blem c'est que je bosse sous solaris via ssh, donc ddd ben...
 
Va falloir que je rapatrie tout ca chez moi ce soir pour tester le debuggueur...
 
Et ce soir personne sera la pour m'aider :/
 
Donc si quelqu'un sait ce que je peux faire, ca m'arrangerai beaucoup :jap:
 
Car avec le debugguer je vois pas ce que je peux changer... :cry:


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
mood
Publicité
Posté le 31-10-2002 à 18:16:40  profilanswer
 

n°238127
VisualC++
J'va y penser ...
Posté le 31-10-2002 à 19:03:12  profilanswer
 

Euh j'ai pas tout lu mais 2 truc
 

Code :
  1. int iBRecv = recvfrom(sockFD, (char*) &datpack, sizeof(struc packet), 0, (struct sockaddr *)&their_addr, (void *) &addr_len)
  2. if (iBRecv == SOCKET_ERROR) {
  3. .....
  4. }


 
Car ton MAX y a aucune raison qu'il soit correct vs le sizeof de la structure, et la fnc retourne la taille du buffer recu (pour tes operations apres).
Y a aussi le cast explicite en char* de ta structure pour recevoir les donnees.
 
 
Bon sinon comme dit pas tt lu les explications donc desole si deja dit.


---------------
VT ... Vaucluse / Vrille(euse :sarcastic: ) c'est pareil tant qu'il y a l'humour :D
n°238129
LeGreg
Posté le 31-10-2002 à 19:20:25  profilanswer
 

Tetedeiench a écrit a écrit :

 
Greg, le packet, a la base, c'est moi qui l'envoie.
 
J'ai mis le buffer a 2000 pour etre tranquille pour les tests, mais a la base j'envoie une structure composee de 2 int, de 2 char[50] et de 1 char[1026], ce dernier que je veux copier dans le char[1026] passe en aprametre...




 
Je disais juste que donner la possibilite de recevoir par une entree quelconque plus que ce que tu peux stocker dans la memoire que tu as alloue est une erreur grossiere dans ton programme. Voila. C'est une erreur tout le temps. Meme si ce n'est pas ca qui fait planter ton programme.
 
LeGreg

n°238134
LeGreg
Posté le 31-10-2002 à 19:45:12  profilanswer
 

Kristoph a écrit a écrit :

 
Je ne vois pas pourquoi memmove devrait faire une copie supplémentaire ? Je dis ça d'après une vielle implémentation de memmove que j'avais fait il y a bien longtemps et je suis sur de m'en être tiré en une seule copie ;)




 
oops sorry effectivement
il faut juste verifier que la memoire dest n'overlappe pas la memoire source et sinon copier en sens inverse (de la fin vers l'avant du buffer).
 
A+
LeGreg

n°238143
Tetedeienc​h
Head Of God
Posté le 31-10-2002 à 20:41:21  profilanswer
 

VisualC++ a écrit a écrit :

Euh j'ai pas tout lu mais 2 truc
 

Code :
  1. int iBRecv = recvfrom(sockFD, (char*) &datpack, sizeof(struc packet), 0, (struct sockaddr *)&their_addr, (void *) &addr_len)
  2. if (iBRecv == SOCKET_ERROR) {
  3. .....
  4. }


 
Car ton MAX y a aucune raison qu'il soit correct vs le sizeof de la structure, et la fnc retourne la taille du buffer recu (pour tes operations apres).
Y a aussi le cast explicite en char* de ta structure pour recevoir les donnees.
 
 
Bon sinon comme dit pas tt lu les explications donc desole si deja dit.
 




 
Mon visu !
 
Je te croyais mort :love:
 
Je modifie le MAXBUFLEN mais m'est avis que cela n'est pas ca, car la structure recoit des donnees correctes que je peux imprimner via printf caractere par caractere, et c'est ce que j'attends...
 
C'est l'acces au pointer en parametre qui deconne :cry:


Message édité par Tetedeiench le 31-10-2002 à 20:41:33

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°238146
Tetedeienc​h
Head Of God
Posté le 31-10-2002 à 20:46:34  profilanswer
 

OH une idee ca viens peut etre de la compilation !
 
Je le fais sous solaris, avec :
 
g++ -c mySocketlib.c
g++ -o listener listener.c mySocketlib.o -lnsl -lsocket
 
On est oblige d'utiliser g++ :/


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°238148
Tetedeienc​h
Head Of God
Posté le 31-10-2002 à 20:54:26  profilanswer
 

Ca le fait aussi sur ma debian :cry:
 
Je peux LIRE le champ data mais pas ecrire...
 
EDIT : Si je peux ecrire dedans avant le recv...
 
C'est quand je copie le 1er caractere recu que ca merde...
 
C'est dingue ca... ( j'avance un peu :wahoo: )


Message édité par Tetedeiench le 31-10-2002 à 21:03:34

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°238155
Tetedeienc​h
Head Of God
Posté le 31-10-2002 à 21:21:44  profilanswer
 

Donc, si je recapitule.
 
Je peux :
 
lire / ecrire dans data[0] avec un caractere constant ( 'a', 'b';).
 
Lire/ecrire dans datpack.data2[0] avec un caractere constant ( 'a', 'b';)
 
Je ne peux pas ecrire un caractere de datpack.data2[0] dans data[0].
 
J'ai essaye les cast (char) d'un cote, des deux cotes, rien n'y fait :cry:
 
OK, je viens de faire un nouveau test.
 
Quand je copie quelque chose du tableau datpack.data2 dans un tableau declare en local, ca chie aussi...
 
Donc leprobleme ne viens pas du parametre mais bien de ce que je recois.
 
Pourtant, il recoit bien un caractere ( le printf("%s\n", datpack.data2[0]) renvoie bien le caractere h, ce qui est coherent.
 
Au secours :cry:
 
J'AI TROUVE !
 
Si je fais l'assignment en tant que :
 
data[0] = (char)(int)(datpack.data)[0];
 
Ca passe :heink:
 
(desole pour les aprenthese mais je voulais etre sur).
 
Quelqu'un peux m'expliquer please :heink:


Message édité par Tetedeiench le 31-10-2002 à 21:29:43

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°238249
Musaran
Cerveaulté
Posté le 01-11-2002 à 03:09:04  profilanswer
 

Bon, sans avoir tout bien suivi, ni bien connaître...
 

Code :
  1. struct sockaddr_in their_addr;
  2. recvfrom(sockFD, &datpack, MAXBUFLEN-1, 0, (struct sockaddr *)&their_addr, (void *) &addr_len)

C'est normal d'avoir un type différent et de faire un cast (struct sockaddr *) ?
 

Code :
  1. data[0] = (char)(int)(datpack.data)[0];

C'est tellement insensé que je pense "bogue de compilateur".
Désactive les optimisations, sait-on jamais...
 
Ton débogueur te permet-il de voir l'état des variables au moment critique ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°238260
VisualC++
J'va y penser ...
Posté le 01-11-2002 à 10:06:51  profilanswer
 

:hello: Iench
 
Non non pas mort ;)
 
Bon sinon perso je ferais comme ca (desole pas teste si ca marche chez moi mais ma mdk sous vmw est hs).
 

Code :
  1. int myRecv(int sockFD, char *sourceIPAddress, int portNumber, char *data) 
  2. int addr_len; 
  3. struct sockaddr_in their_addr; 
  4. struct packet datpack;
  5. addr_len = sizeof(struct sockaddr);
  6. char* buffer = (char *) new char[sizeof(struct packet)];
  7. if (buffer == NULL) {
  8.  perror("Allocation buffer tampon a echouee" );
  9.  return -1;
  10. }
  11. int iBRecv = recvfrom(sockFD,  buffer, sizeof(struct packet), 0, (struct sockaddr *)&their_addr, &addr_len);
  12. if (iBRecv == SOCKET_ERROR) { 
  13.  perror("recvfrom" ); 
  14.  delete buffer;
  15.  return -1; 
  16. }
  17. else {
  18.  printf("recv OK (%d bytes received)\n", iBRecv); 
  19. }
  20. if (iBRecv != sizeof(struct packet)) {
  21.  printf("donnees recues insuffisantes" ); 
  22. }
  23. memcpy(&datpack, buffer, iBRecv);
  24. printf("datpack.data2 %c \n",datpack.data2[0]);
  25. delete buffer;
  26. return iBRecv; 
  27. }



---------------
VT ... Vaucluse / Vrille(euse :sarcastic: ) c'est pareil tant qu'il y a l'humour :D
mood
Publicité
Posté le 01-11-2002 à 10:06:51  profilanswer
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Java]TCP Client ne marche que partiellement pkoi?[Resolu]PB en C !!! PB avec poids fort ! poids faible ! [RESOLU]
[PHP] Include/require à distance (résolu, merci!)Copier un caractère dans une chaine de caractères
[résolu] images Tiff : tag spécifiant la position du repère[PHP] remplacer une chaine de caractères dans un .ini [resolu]
problème unix-windows (résolu)problème sur les fichiers (ouverture, fermeture, etc.) [résolu]
[PHP] Insérer des valeurs dans une zone de texte [Résolu]problemes sur les tableaux (résolu)
Plus de sujets relatifs à : [C/C++] Copier un char* dans un char*? pas resolu-C'est pour ce soir:/


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)