bonsoir , j'ai des valeurs enregistrer dans un vecteuret j'ai besoin de les mètres dans un buffer de typeCitation:
std::vector<std::string>
j'arrive pas a faire cette étape.Citation:
void*
merci d'avance.
Version imprimable
bonsoir , j'ai des valeurs enregistrer dans un vecteuret j'ai besoin de les mètres dans un buffer de typeCitation:
std::vector<std::string>
j'arrive pas a faire cette étape.Citation:
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:
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>) .
Citation:
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: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:
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.
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.Citation:
@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" :weird:
Nous ne sommes pas là pour faire ton travail. Ici c'est un forum d'aide de bénévoles.
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:
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 :D
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