bonsoir , j'ai des valeurs enregistrer dans un vecteuret j'ai besoin de les m�tres dans un buffer de typestd::vector<std::string>j'arrive pas a faire cette �tape.void*
merci d'avance.
bonsoir , j'ai des valeurs enregistrer dans un vecteuret j'ai besoin de les m�tres dans un buffer de typestd::vector<std::string>j'arrive pas a faire cette �tape.void*
merci d'avance.
un "void*", c'est un monstre C, qui signifie "une adresse, mais sans type sous-jacent". Il est toujours sous-entendu: "Il va falloir une conversion bien sale pour en faire quelque chose".
Tout d�pend donc de ce que ce void* est pr�cis�ment.
Ca d�pend de la fonction qui l'utilise.
Pour passer un std::vector<std::string> en void* il te faut v�rifier d�j� la porter de ton std::vector, ceci va d�finir si tu l'alloues sur le stack ou la pile ( new/delete ou pas)
Mais apr�s il faut bien comprendre que le void* tu l'utilises dans des cas tr�s pr�cis... Est-ce ton cas ici?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9 void foo2(void* vector) { std::vector<std::string>* myVector = (std::vector<std::string>*)vector; } void foo() { std::vector<std::string> myVector; foo2((void*)&myVector); }
L'important dans ton cas c'est de savoir comment est utilis� ton void* apr�s... Est-ce un tableau de chaine de caract�re fini pas un '\0'? ce qui en a l'air...
Que sais tu exactement de ce que va faire ta fonction avec ton void* ensuite?
je suis entrains de cr�er un dll pour un syst�me d'automatisation , donc pour faire les test n�cessaire pour assurer le bon fonctionnement je doit communiquer avec le Workflow donc j'ai besoin d'envoyer un buffer au Workflow avec le ZMQ et pour faire �a mon buffer doit �tre de type (const void*) or que les donn� que je veux envoyer sont de type (std::vector<std::string>) .
zmq_send(void *s, const void *buf, size_t len, int flags);
Ce que je comprends au vu de la signature de ta fonction:
Buf est une chaine de caract�re, len est la taille de ta chaine... Donc tu n'envois pas un std::vector<std::string> mais plut�t un std::string::c_str().
Code : S�lectionner tout - Visualiser dans une fen�tre � part zmq_send(void *s, const void *buf, size_t len, int flags);
Lie la documentation de ta fonction... (http://api.zeromq.org/3-3:zmq-send) il y a m�me des exemples sur cette page trouv� en 2 secondes sur google.
j'ai deja vu ces exemple mes dans mon cas mon buf doit contient les valeur que j'ai deja stock� dans une variable C de type std::vector<std::string>
comme vous voyez dans ce code j'ai besoins de comparer 2 fichier de config et si je trouve une defference je doit les envoyer au worklow avec zmq_send
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 void fileToMultiset(std::fstream& from, std::multiset<std::string>& to) // met les lignes du fichier dans un vecteur { for (std::string line; std::getline(from, line);) to.insert(line); } std::vector<std::string> difference(std::multiset<std::string>& fOld, std::multiset<std::string>& fNew) // retourne les lignes pr�sentes dans new qui ne sont pas dans Old { std::vector<std::string> result; std::set_difference(fNew.begin(), fNew.end(), fOld.begin(), fOld.end(), std::back_inserter(result), std::less<std::string>()); return result; } int main(void) { std::multiset<std::string> A, B; std::vector<std::string> C; fileToMultiset(old_file, A); fileToMultiset(new_file, B); C = difference(A, B); void *context = zmq_ctx_new(); void *client = zmq_socket(context, ZMQ_PUSH); zmq_connect(client, "tcp://*:5557"); int buffer[50]; zmq_send(client, buf , sizeof(C), 0); zmq_recv(client, buffer, 10, 0);
Mais il faut r�fl�chir un peu, pourquoi tu veux envoy� un std::vector<std::string> alors que tu peux envoyer plusieurs std::string! voir stringifier ton std::vector et l'envoyer dans ton socket d'une traite.
Ce qui est sur, c'est que tu ne peux pas envoy� un std::vector comme ca sans plus de travail de ta part
RTFM et KISS!
@Astraya: Il n'est pas question de string lors de l'envoi lui-m�me, on peut envoyer un tableau d'octets arbitraire.
� part ce point-l� tu as raison, il faut s�rialiser le vecteur de strings, il est impossible � envoyer tel quel.
Personnellement, je proposerais un format:
- Taille s�rialis�e totale en bytes
- Nombre de strings
- Pour chaque string:
- Taille totale en bytes
- Contenu
Les strings �tant transmises avec ou sans le caract�re nul terminal; de pr�f�rence sans, pour obliger le destinataire � l'ajouter lui-m�me plut�t que s'y fier.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Oui bien sur, j'ai �cris un peu vite mais dans envoyer une string je voulais bien sur faire allusion � envoyer le buffer std::string ( std::string::c_str() ). Autant pour moi si cela portait � confusion.@Astraya: Il n'est pas question de string lors de l'envoi lui-m�me, on peut envoyer un tableau d'octets arbitraire.
dans mon cas comment je peut s�rialiser ce vecteur l� !! j'ai aucune id�e concernant cette parie
Si j'en crois ton profil tu es "Ing�nieur d�veloppement logiciels"![]()
Nous ne sommes pas l� pour faire ton travail. Ici c'est un forum d'aide de b�n�voles.
Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation r�seau ?
Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.
s�rialiser des valeurs, c'est s�rialiser chacune, dans un ordre assez d�termin� pour pouvoir d�s�rialiser � l'arriv�e.
bonsoir , pour ceux qui ont la m�me probl�me que moi , c'est le r�sultat :
- mettre les valeurs des fichiers a comparer dans 2 vecteur
- cr�er une variable C par exemple de type std::vector<std::string>
- mettre la r�sultat de cette comparaison dans la variable C
- puis cr�er une autre variable str_buf de type string
- cr�er une variable msg de type string aussi qui va �tre envoyer a la suite
- en fin s�rialiser le vecteur C et n'oubliez pas de mettre un d�limiteur entre chaque ligne de ce vecteur
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 string msgToWF = ""; for (int i = 0; i < (C.size() / 2); i++) { msgToWF += C[2 * i]; string str_buff = C[2 * i + 1]; string PC, Val; istringstream iss(str_buff); iss >> PC >> Val; msgToWF += " " + Val + "\n"; }
dans ce code mon message contient : PC OldVal NewVal
bon courage a tous et pour celui qui ont cass� la t�te avec moi merci pour vos repense et vos conseil![]()
Juste pour dire que ce m�canisme de s�rialisation est bien trop lourd et pourri.
Il suffit que l'un de vos string contiennent le d�limiteur et vous �tes dans la mouise.
Il existe tout un tas de librairie qui font la s�rialisation et la d�s�rialisation de mani�re bien plus simple et fiable que ce bidule.
boost::serialization
Partager