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 :

Passer un context en void *


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 35
    Par défaut Passer un context en void *
    Bonjour!

    J'ai deux paramètres à passer en paramètre sous forme de const void * mais je ne vois pas comment faire.

    mes deux paramètres :
    sqlite3 * conn;
    int id;

    Puis comment les récuperer?

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void ctx[2];
    void info;
    ctx[0]=(void) *conn;
    ctx[1]=(void) id_profile;
    info=(void) ctx;
    et de passer &info
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    :328:39: erreur: pointer of type ‘void *’ used in arithmetic [-Werror=edantic]
    :328:39: erreur: dereferencing ‘void *’ pointer [-Werror]
    :328:2: erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être
    :329:34: erreur: pointer of type ‘void *’ used in arithmetic [-Werror=edantic]
    :329:34: erreur: dereferencing ‘void *’ pointer [-Werror]
    :329:2: erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être
    cc1: all warnings being treated as errors

  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
    Le type void est à comprendre comme un type vaguement équivalent à un entier de longueur 0 bits.

    Il n'y a pas de variable de type void, mais des pointeurs vers void sont possibles.

    Le cast vers void signifie "cher compilateur, veuillez ignorer la valeur de l'expression convertie".

    Essaie ceci:
    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
    typedef struct ctx{
        sqlite3 * conn;
        int id;
    } ctx_t;
     
    int main(int argc, char*[] argv){
        sqlite3 * conn;
        int id;
        //...
        ctx_t context;
        context.conn=conn;
        context.id=id;
     
        void* arg = &context;
        f(arg);
    };

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 35
    Par défaut
    J'ai mis le typedef dans le .h
    Puis dans la fonction j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sqlite3 * conn = user_ctx->conn;
    int id_profile = user_ctx->id;
    et le reste dans le main.

    Mais j'obtiens une erreur ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    :328:27: erreur: dereferencing ‘void *’ pointer [-Werror]
    :328:27: erreur: request for member ‘conn’ in something not a structure or union
    :329:27: erreur: dereferencing ‘void *’ pointer [-Werror]
    :329:27: erreur: request for member ‘id’ in something not a structure or union

  4. #4
    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
    la fonction doit reconvertir le pointeur vers void en un context.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f(void* arg){
    ctx_t* user_ctx = (ctx*)arg;
    sqlite3 * conn = user_ctx->conn;
    int id_profile = user_ctx->id;
    }

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 35
    Par défaut
    Merci bien! Ca n'a pas réussi à faire d'erreur !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2013, 12h23
  2. Réponses: 0
    Dernier message: 23/04/2010, 12h07
  3. [Debutant] Passer un context à une routine
    Par cryosore dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 30/12/2009, 12h32
  4. passer un parametre dans un void *
    Par contremaitre dans le forum C
    Réponses: 16
    Dernier message: 27/02/2008, 14h57
  5. comment passer du contexte string au int
    Par Pauli dans le forum Langage
    Réponses: 2
    Dernier message: 17/09/2007, 13h02

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