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.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
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); }
Homer J. Simpson
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?
Homer J. Simpson
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.
Homer J. Simpson
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!
Homer J. Simpson
@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.
Homer J. Simpson
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.
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- Une variable de moins est une source d'erreur en moins.
- Un pointeur de moins est une montagne d'erreurs en moins.
- Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
- jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
- La plus sotte des questions est celle qu'on ne pose pas.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager