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

VC++ .NET Discussion :

Comment utiliser (void* data)


Sujet :

VC++ .NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut Comment utiliser (void* data)
    Bonjour,

    je voudrais récupérer le contenu d'une méthode :

    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
    void init()
    {
    	static const void* type =
    	{
    		static_cast<void*>(new std::string("it's easy to break stuff like this!"))
    	};
     
    	test(&type);
    }
     
    void test(void* vp)
    {
    	//void* vp = static_cast<void*>(new std::string("it's easy to break stuff like this!"));
    	std::string* sp = static_cast<std::string*>(vp);
    	std::string monType = *sp;
    	String^ type = gcnew String(monType.c_str());
    	Console::Write(type);
    }
    mais je récupère une valeur vide quand je lance init()

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    En C/ C++, le type void* est pour faire la généricité
    Donc, pour le passage de paramètres, il ne faut pas passer 1 variable de type void* mais l'adresse/ 1 pointeur d'1 variable normalement, et avoir 1 énumération pour savoir quel type on passe.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <iostream>
    #include <string>
     
    #include <cstdlib>
     
     
    typedef enum e_test_type {
        TEST_TYPE_STING = 0,
        TEST_TYPE_COORD
    } t_test_type;
     
     
    typedef struct s_coord {
        s_coord(size_t input_x=0, size_t input_y=0) : x(input_x), y(input_y) {}
        s_coord(const s_coord& other) : x(other.x), y(other.y) {
            std::cout << "s_coord - copy constructor" << std::endl;
        }
     
        size_t x, y;
    } t_coord;
     
     
    void func_test(void* vp, t_test_type type) {
        if (type == TEST_TYPE_STING) {
            std::string* str  = (std::string*) vp;
            std::string& rstr = *((std::string*) vp);
     
            std::cout << "func_test: " << std::endl << "*) " << (*str) << std::endl << "*) " << rstr << std::endl;
        } else /* if (type == TEST_TYPE_COORD) */ {
            t_coord* coord = static_cast<t_coord*>(vp);
            t_coord ccoord = *( static_cast<t_coord*>(vp) );
     
            std::cout << "func_test: " << std::endl << "*) " << coord->x << ", " << coord->y << std::endl << "*) " << ccoord.x << ", " << ccoord.y << std::endl;
        }
    }
     
     
    /*****************************************************************************/
    /***********************************  Main  **********************************/
    /*****************************************************************************/
     
    int main(int argc, char** argv)
    {
        std::string str = "it's easy to break stuff like this!";
        t_coord coord(15, 57);
     
        func_test(&str,   TEST_TYPE_STING);
        func_test(&coord, TEST_TYPE_COORD);
     
     
        return EXIT_SUCCESS;
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    Merci.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Non cela fonctionne

    Mais ce n'est plus 1 type std::string, mais char*. Tu ne peux pas caster 1 char* vers 1 std::string ( peut-être avec 1 reinterpret_cast mais c'est ultra plantogène).
    Ensuite la méthode .c_str() retourne 1 chaîne constante : donc il faut soit retirer le cont (avec 1 const_cast ou 1 cast C) soit passer 1 paramètre const void* (ce qui peut-être gênant)
    Enfin, il faudrait sûrement faire 1 copie du retour de la méthode .c_str() pour ne pas avoir de suprises. En C, on passe par strcpy/ strncpy/ petites sœurs. En C++/ C# je te laisse chercher.

    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
    // ...
     
    typedef enum e_test_type {
        TEST_TYPE_STING = 0,
        TEST_TYPE_CHAR,
        TEST_TYPE_COORD
    } t_test_type;
     
    // ...
     
    void func_test(void* vp, t_test_type type) {
    // ...
        } else /* if (type == TEST_TYPE_CHAR) */ {
            char* cstr = static_cast<char*>(vp);
     
            std::cout << "func_test: " << std::endl << *str << std::endl;
        }
    }
     
     
    int main()
    {
        std::string ns("test");
        char* myns = const_cast<char*>( ns.c_str() );
     
        func_test(myns, TEST_TYPE_CHAR);
     
        return 0;
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    C'est bon

    const char* perd la valeur

    en recréant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string* str = new std::string(mystr);
    ça fonctionne, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/11/2008, 01h22
  2. Réponses: 4
    Dernier message: 19/06/2008, 15h22
  3. [SQL SERVER 2005] comment changer le "data path" ?
    Par Yorel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/07/2007, 10h42
  4. [C#][Débutant] Comment gerer des datas dans une form
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/04/2006, 00h10
  5. Comment utiliser les Data Modelers
    Par mqsi dans le forum Rational
    Réponses: 2
    Dernier message: 18/10/2005, 12h28

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