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 :

conversion std:string to void*


Sujet :

C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par d�faut conversion std:string to void*
    Bonjour, j'ai un std::string que je voudrais convertir en void*.

    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
     
     
    void sync(std::string & value, Field field, Group group, ArchiveFlags flags)
    	{
            MYSQL_BIND bind;
            my_bool is_null;
            unsigned long length;
            my_bool error;
     
            /* STRING COLUMN */
            bind.buffer_type= MYSQL_TYPE_STRING;
            bind.buffer= value.c_str(); // erreur: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]|
            bind.buffer_length= value.size();
            bind.is_null= &is_null;
            bind.length= &length;
            bind.error= &error;
     
            ....
     
    	}
    D'apres ce que j'ai vu, il faudrait passer par un static_cast, mais j'aimerais savoir si il y avait quelque chose de plus rapide et de plus simple � mettre en place :/

    Merci

  2. #2
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bind.buffer= const_cast<void*>(value.c_str());
    Ou plus salement :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bind.buffer= (void*)value.c_str();

  3. #3
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par d�faut
    Le fait d'utiliser des cons_cast<char*> sembles me supprimer l'erreur.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
            bind.buffer= const_cast<char*>(value.c_str());
    J��diterais mon message si mes cas de tests ne passent pas � cause d'une mauvaise valeur renvoy�e :/

  4. #4
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par d�faut
    ah ^^, merci pour la r�ponse , je vais voir si le const_cast<char*> me renvoie une autre valeur que le const_cast<void*>. Merci de la r�ponse

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Par contre, il faut faire attention, si c_str renvoie un const, c'est pas pour rien. Normalement, ce n'est pas modifiable

    Il faudrait mieux faire �a proprement, en cr�ant une nouvelle variable string C-style et faire un strcpy :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    char* str = new char[value.size()+1];
    strcpy(str, value.c_str());
    // utilisation de str
    value = string(str); // si nécessaire
    delete[] str;
    En plus, d'un point de vue conceptuel, j'imagine que le but est de retourner la chaine contenu dans ta table SQL. Il faut donc que le char* pass� en param�tre soit correctement allou�. L�, tu utilises values, ce qui implique que le code appelant cette fonction pense � allouer la m�moire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    string str;
    sync(str, field, group, flags); // problème, str est vide
     
    string str(2000, ' ');
    sync(str, field, group, flags); // ok, str contient 2000 char
    Ce qui peut �tre probl�matique si le code appelant ta fonction "oubli" de le faire

    L'id�al est de faire l'allocation dans la fonction, pour r�cup�rer la string. De plus, pour ce type de fonction (qui permet d'obtenir une valeur en retour) autant utiliser les retours de fonction.
    J'aurais donc �crit le code suivant :
    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
    string sync(std::string & value, Field field, Group group, ArchiveFlags flags)
    {
            MYSQL_BIND bind;
            my_bool is_null;
            unsigned long length;
            my_bool error;
            char buffer[2000]; // taille � changer ou � passer en param�tre de fonction
     
            /* STRING COLUMN */
            bind.buffer_type= MYSQL_TYPE_STRING;
            bind.buffer= buffer;
            bind.buffer_length= 2000;
            bind.is_null= &is_null;
            bind.length= &length;
            bind.error= &error;
    
            return string(buffer);
    }

  6. #6
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur Junior
    Inscrit en
    Septembre 2011
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 170
    Par d�faut
    Ah, vraiment int�ressant, je ne suis plus au boulot, mais j'avais un bug qui persistait (r�cup�ration de valeurs nulles), je vais voir si votre solution ne peut pas r�soudre ce probl�me, ce qui m'arrangerait beaucoup !

    Merci en tout cas!

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

Discussions similaires

  1. conversion std::string -> unsigned char*
    Par acheo dans le forum Langage
    R�ponses: 3
    Dernier message: 26/02/2010, 17h35
  2. Conversion std::string vers num�rique
    Par mister3957 dans le forum SL & STL
    R�ponses: 9
    Dernier message: 26/02/2007, 20h40
  3. Conversion std::string QString
    Par krokmitaine dans le forum Qt
    R�ponses: 15
    Dernier message: 24/11/2006, 10h14
  4. conversion std::string en std::istringstream
    Par flipper203 dans le forum SL & STL
    R�ponses: 3
    Dernier message: 06/07/2006, 18h34
  5. conversions std::string <---> CString
    Par Rupella dans le forum MFC
    R�ponses: 5
    Dernier message: 21/02/2006, 15h11

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