IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

std::vector<std::string> to (void*)


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2015
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 23
    Par d�faut std::vector<std::string> to (void*)
    bonsoir , j'ai des valeurs enregistrer dans un vecteur
    std::vector<std::string>
    et j'ai besoin de les m�tres dans un buffer de type
    void*
    j'arrive pas a faire cette �tape.
    merci d'avance.

  2. #2
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    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.

  3. #3
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    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)

    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);
    }
    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?

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    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?

  5. #5
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2015
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 23
    Par d�faut
    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);

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    Ce que je comprends au vu de la signature de ta fonction:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    zmq_send(void *s, const void *buf, size_t len, int flags);
    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().
    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.

  7. #7
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2015
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 23
    Par d�faut
    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);

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    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!

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    @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.

  10. #10
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    @Astraya: Il n'est pas question de string lors de l'envoi lui-m�me, on peut envoyer un tableau d'octets arbitraire.
    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.

  11. #11
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2015
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 23
    Par d�faut
    dans mon cas comment je peut s�rialiser ce vecteur l� !! j'ai aucune id�e concernant cette parie

  12. #12
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    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.

  13. #13
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    s�rialiser des valeurs, c'est s�rialiser chacune, dans un ordre assez d�termin� pour pouvoir d�s�rialiser � l'arriv�e.

  14. #14
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2015
    Messages
    23
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : F�vrier 2015
    Messages : 23
    Par d�faut
    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

  15. #15
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    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

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 19
    Dernier message: 29/09/2014, 17h12
  2. Cast d'un std::vector<T> -> std::vector<X>
    Par Dono_S dans le forum Langage
    R�ponses: 3
    Dernier message: 09/04/2012, 21h31
  3. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    R�ponses: 11
    Dernier message: 01/03/2011, 23h34
  4. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    R�ponses: 27
    Dernier message: 24/07/2007, 16h23
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    R�ponses: 20
    Dernier message: 05/01/2005, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo