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 à l'essai
    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
    Points : 11
    Points
    11
    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 sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    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.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • 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.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 238
    Points
    2 238
    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?
    Homer J. Simpson


  4. #4
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 238
    Points
    2 238
    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?
    Homer J. Simpson


  5. #5
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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 chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 238
    Points
    2 238
    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.
    Homer J. Simpson


  7. #7
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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 chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 238
    Points
    2 238
    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!
    Homer J. Simpson


  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 238
    Points
    2 238
    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.
    Homer J. Simpson


  11. #11
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    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.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • 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.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Membre à l'essai
    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
    Points : 11
    Points
    11
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 123
    Points
    12 123
    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