Excuser moi, de vous poser cette question toute bête, mais je n'arrive pas a trouver a cette question:
Savez vous comment on converti une donné u_char en une donné char
merci!
Version imprimable
Excuser moi, de vous poser cette question toute bête, mais je n'arrive pas a trouver a cette question:
Savez vous comment on converti une donné u_char en une donné char
merci!
Ca passe pas ca ?Code:
1
2
3
4 char a; u_char b; a = (char) b;
Y'a peut etre mieux mais pour ma part, j'aurais simplement fait ce petit cast (en meme temps j'ai pas testé ... mais je vois pas trop pk ca ne passerait pas)
excuse moi, g mal posée le probleme:
j'ai une valeur:
et j'aimerais la mettre sous la forme:Code:const u_char *packet
et j'ai beaucoup de malCode:const char *paquet
strcpy(a, b) ?
ta solution d'avant était mieux, elle générait moin d'erreur, de plus il me semble que strcpy n'utilise pas les u_char!
Apres réflexion, sprintf doit pouvoir t'aider a merveille
sprintf(a, "%s", b); devrait passer
Sa ne le prend toujours pas car, ma variables paquet est une constante et sprintf ne le prend pas!
bah j'avoue pas connaitre la fonction qu'il te manque.
Au pire, tu dois pouvoir faire, en partant de ma 1ere solution :
Mais c'est quand meme très laid ...Code:
1
2
3
4 int i = 0; a = new char[strlen(b)]; for(i = 0; i < strlen(b); i++) a[i] = (char) b[i];
sa ne marche pas top non plus!
Le dernier code de Worldofdada me paraît la bonne solution (au +1 près pour la longueur et le \0), sauf que c'est exactement ce que std::copy fait.
Au fait, pourquoi dois-tu jongler entre les unsigned char* et les char* ?
la variable u_char est utiliser par deux méthode et la méthode suivante ne marche qu'avec des char, donc pour cela je doit effectuer une conversion tout en faisant attention de ne pas perturber les autres classes. quand j'utilise strcpy, il me créé des erreurs dans une classe précédente, je ne te dit pas la prise de tête!
Si je réussie a régler se probleme, cela me débloque dans bien des endroits!!! :?
Code:
1
2
3
4
5
6
7 #include <algorithm> u_char* Truc = ... tes données ... int Taille = ... taille de Truc ... char* Machin = new char[Taille]; std::copy(Truc, Truc + Taille, Machin);
hola!!! sa ne doit pas etre sa, sa m'affiche une cinquantaine d'erreure!!!
a croire qu'il n'existe rien pour ma conversion!!!!
Si tu nous montrais plutôt ces 50 erreurs ?
J'avoue que 50 c'est exagéré mais y'en a quelques une. voici une partie de mon code:
{invalid conversion from `const char*' to `char*'Code:
1
2
3
4
5
6
7
8
9 void AnalyseurTraficEthernet::wrapperCallback(u_char *user,const struct pcap_pkthdr *hdr,const u_char *packet) { user=NULL; hdr=NULL; AnalyseurTraficEthernet * objAnalyseurTraficEthernet = (AnalyseurTraficEthernet*) ptObjetAnalyseurTraficEthernet; const char * paquet= new char[200]; std::copy(packet, packet + 200, paquet); objAnalyseurTraficEthernet->callback(paquet); }
initializing argument 1 of `void AnalyseurTraficEthernet::callback(char*)}
->se trouvant sur :
{instantatied from `_Outputlter std::__copy_aux2(_inputlter,_inputlter,_Oooutputlter,__true_type) [with_Inputlter = cnst u_char*,_Ooutputlter = cnst char*]'Code:objAnalyseurTraficEthernet->callback(paquet);
instantatied from `_Outputlter std::__copy_ni2(_inputlter,_inputlter,_Oooutputlter,__true_type) [with_Inputlter = cnst u_char*,_Ooutputlter = cnst char*]'
instantatied from `_Outputlter std::__copy_ni1(_inputlter,_inputlter,_Oooutputlter,__true_type) [with_Inputlter = cnst u_char*,_Ooutputlter = cnst char*]'
instantatied from `_Outputlter std::__copy(_inputlter,_inputlter,_Oooutputlter,__true_type) [with_Inputlter = cnst u_char*,_Ooutputlter = cnst char*]'}
->se trouvant dans le stl_algobase.h
instanted from here
-> se trouvant sur:
assignement of read-onlyCode:std::copy(packet, packet + 200, paquet);
->se trouvant dans le stl_algobase.h
Bon en fait tu n'as qu'une erreur (les fonctions standard à base de templates portent souvent à confusion, quand ils provoquent des erreurs).
Forcément, si tu veux modifier une chaîne constante, le compilo va râler. Utilise un char* non-const, ce n'est pas parce que ta fonction prend un const char* que tu ne peux pas lui fournir un char*. Cela indique juste que cette fonction ne modifiera pas son paramètre.
Je te remercie, tout de suite le logiciel m'agresse moins les yeux avec moins de rouge mais le il me met des erreur dans des fonctions qui marchait tres bien avant, meme dans une appelle de fonction!
Code:AnalyseurTraficEthernet * objAnalyseurTraficEthernet = (AnalyseurTraficEthernet*) ptObjetAnalyseurTraficEthernet;
Code:undefined reference to {ptObetAnalyseurTraficEthernet'
et il me l'affiche deux fois!
ptObjetAnalyseurTraficEthernet est défini où ?
C'est une erreur de frappe dans ton post ou dans ton code, le fait qu'il lui manque un 'j' dans le message d'erreur ?
je l'ai définit dans le .h
pour le j c'est une erreur de frappe!Code:extern void* ptObjetAnalyseurTraficEthernet;
sinon j'ai essayer une autre façon mais san grand résultat
avec reinterpret_cast. moin de probleme mais sa ne veut pas convertir!
Il faut définir ta variable dans une unité de traduction (fichier .cpp), en + de la déclaration dans l'en-tête avec extern.
http://c.developpez.com/faq/c/?page=...TYPES_globales
Sinon parenthèse: pour jongler entre des buffers de char* et des buffers de unsigned char*, un simple reinterpret_cast<> suffit. D'autant que dans ces échanges, on caste déjà comme des sauvages nos données.
Maintenant, les const qui manquait ici, était un autre problème.
et pourtant on peut pas dire que tu ais manqué d'aide... :roll:Citation:
et j'ai beaucoup de mal
http://www.developpez.net/forums/viewtopic.php?t=307904
oui, et d'ailleur je vous remercie de votre aide sinon, je serais toujours bloqué au meme point.
J'ai déja essayer le réinterprete_cast et sa ne marche pas! peut être que finalement mes classes précédente sont fausse!!
ça ne marche pas n'amène à rien. Il faut donner le bout de code en cause, et l'erreur rencontrée.
voila le code que j'ai
l'erreur est :Code:
1
2
3
4
5
6
7
8 void AnalyseurTraficEthernet::wrapperCallback(u_char *user,const struct pcap_pkthdr *hdr,const u_char *packet) { user=NULL; hdr=NULL; AnalyseurTraficEthernet * objAnalyseurTraficEthernet = (AnalyseurTraficEthernet*) ptObjetAnalyseurTraficEthernet; char * paquet (reinterpret_cast<const u_char *>(packet)); //l'erreur est la objAnalyseurTraficEthernet->callback(paquet); }
invalid conversion from `const u_char*' to `char*'
et si j'enleve le const, il me met met l'erreur suivante:
invalid conversion from `u_char*' to `char*'
Faut essayer de comprendre ce que tu fais... tu veux caster = forcer le type. Hormis le problème de syntaxe, là tu demandes de changer le type de packet en const u_char * alors qu'il est déjà ça.
Je te donne le principe, à toi de transposer:
Code:
1
2 LeTypeQueJeVeux paquet = reinterpret_cast< LeTypeQueJeVeux >( packet );
Le type que je veut c'est du char *, donc voila se que j'ai tapé:
d'aprés se que tu m'a écrit, sa doit etre comme sa.Code:char * paquet = (reinterpret_cast<char *>(packet));
maintenant l'erreur est:
reinterpret_cast from`const u_char*' to `char*' casts away const (or volatile)
De manière générale tu ne peux pas caster sauvagement un truc const en truc non-const.
Essaye avec du const char*.
Tu as parlé de const char *:
soit tu utilises const, soit il te faut créer une copie de tes données.Citation:
et j'aimerais la mettre sous la forme:
Code:const char *paquet
C'est le même problème que là:
http://c.developpez.com/faq/cpp/?pag...TRINGS_to_char
quand je fait se que tu m'a conseiller, cela ne me met plus de probleme lors de la conversion, mais sur la création de pointeur et sur l'envoie d'un signal!!!
Je n'ai pas compris (tu as utilisé const ou une copie ?). Et encore une fois, c'est quoi et où le(s) probleme(s) ?
voisi tout le code source de mon probleme, et quand il y a une erreur elle apparaisse dans ces deux classe, sa c le point cpp:
maintenant dans le .h pour la déclaration du pointeur:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void AnalyseurTraficEthernet::wrapperCallback(u_char *user,const struct pcap_pkthdr *hdr,const u_char *packet) { user=NULL; hdr=NULL; AnalyseurTraficEthernet * objAnalyseurTraficEthernet = (AnalyseurTraficEthernet*) ptObjetAnalyseurTraficEthernet; <-erreur const char * paquet = (reinterpret_cast<const char *>(packet)); objAnalyseurTraficEthernet->callback(paquet); } void AnalyseurTraficEthernet::callback(const char* paquet) { TrameEthernet *trameEthernet = new TrameEthernet(paquet); //emission du signale trameEthernet emit signalTrame (trameEthernet); <- erreur }
et celui du signal:Code:extern void* ptObjetAnalyseurTraficEthernet;
a ma premiere ligne d'erreur, il me dit une phrase qui apparait deux fois dans les erreurs:Code:
1
2
3 signals: void signalTrame (TrameEthernet *);
undefined reference to `ptObjetAnalyseurTraficEthernet'
puis a ma deuxieme ligne d'erreur et me l'affiche deux fois aussi:
undefined reference to `AnalyseurTraficEhernet::signalTrame(TrameEthernet*)'
merci pour votre aide!!
T'as suivi les précédents conseils ? T'as regardé la FAQ C et fait ce qu'il faut pour gérer correctement ta variable globale ?Citation:
undefined reference to `ptObjetAnalyseurTraficEthernet'
On peut voir le corps de la fonction en question ?Citation:
undefined reference to `AnalyseurTraficEhernet::signalTrame(TrameEthernet*)'
j'ai remanier tout le code, pour éviter qu'il bug et maintenant sa marche , je vous remercie pour tout vaut conseille!!! :D