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 :

portabilité du pointeur générique void*


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut portabilité du pointeur générique void*
    Bonjour,

    Je vous explique le contexte avant de poser la question.

    J'ai développé une DLL en C; cette DLL attend un pointeur génériques void* de l'application cliente (l'application qui utilise cette DLL). Je voudrais savoir si le pointeur générique void* sera correctement réceptionné par la DLL; autrement dit est-ce qu'il sera compatible avec un pointeur void* issu d'une application cliente codée en C++ ? (à quelles condition ce passage fonctionne-t-il ?)
    Est-ce que la déclaration du pointeur en extern "c" est suffisante pour ne pas avoir de surprises ?

    (bien évidemment la machine qui a construit la DLL n'est pas la même que celle sur laquelle l'application cliente est construite; pour enlever le cas d'architecture 32/64 on admettra qu'on est sous deux architectures 32 bits).

    Merci d'avance pour toutes vos remarques sur le sujet.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Empiriquement, un pointeur étant censé contenir une adresse mémoire, on peut légitimement penser qu'il sera codé de la même façon sur une même machine mais, effectivement, il faudrait corréler les passages des normes des deux langages pour pouvoir l'affirmer « scientifiquement ».

    Par contre, j'ai effectivement tendance à penser qu'un « extern "C" » suffirait à faire rentrer les choses dans l'ordre si elles avaient besoin de l'être puisque c'est précisément sa fonction (communiquer avec le C).

    Donc, oui, ça devrait suffire. C'est, bien sûr, ce qu'il y a derrière le pointeur qu'il faudra examiner de plus près, puisque complètement rendu abstrait par void. S'il y a des structures de données connues à l'avance, il faudra également inclure leurs déclarations dans ton « extern "C" ».

  3. #3
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Merci de ta réponse,

    Oui effectivement le pointeur void* cachera derrière lui une adresse d'une structure de données quelconque. la DLL se fiche de savoir ce que c'est, car elle n'effectue pas de traitement dessus, elle se contente de le mettre en argument d'une callback (sous la forme d'un void*).

    Pour le extern "c", est-ce une règle valable pour le pointeur void* (*)(void*) également ?

    Et pour un pointeur void*(*)(void*) dans la DLL censé recevoir l'adresse d'une fonction C++ (pas une méthode de classe) pour l'appeler; est-ce que l'appel sera correct ? (à quelles conditions ?).

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    C'est la fonction que tu désires appeler en C++ que tu dois déclarer extern "C" dans le code C++. Il n'y a aucun problème pour les types.

  5. #5
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Merci pour vos confirmations. Je mets le sujet en résolu mais si quelqu'un d'autre a une remarque sur le sujet c'est toujours la bienvenue.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par uknow Voir le message
    Merci de ta réponse,

    Oui effectivement le pointeur void* cachera derrière lui une adresse d'une structure de données quelconque. la DLL se fiche de savoir ce que c'est, car elle n'effectue pas de traitement dessus, elle se contente de le mettre en argument d'une callback (sous la forme d'un void*).
    Hum. Le void* sert à faire transiter des choses diverses et variées. Si toi tu ne fais transiter qu'une seule et même chose (une structure bien définie), pourquoi ne pas mettre directement un pointeur sur cette structure ?
    Le fait que la fonction qui le reçoit le passe simplement à sa voisine sans aucun autre traitement ne lui interdit pas de connaitre et bien définir le type de ce pointeur. Et si la voisine callback reçoit ce pointeur dans un void*, tant mieux pour elle mais c'est pas pour ça que tu dois, toi, le mettre en void* dans tes propres fonctions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    En fait il s'agit d'une DLL, donc elle n'est pas censée connaitre la nature de la structure qui elle est définie dans l'application cliente.

    De même la fonction est définie dans l'application cliente; la DLL dispose d'un pointeur void* p1 et d'un pointeur void*(*p2)(void*); le p2 sera déréférencé pour appeler la fonction en lui passant en paramètre p1. Sans savoir ce que c'est. Un peu dans le même principe de pthread.

    Mon but étant que la DLL soit le plus générique/portable possible.

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

Discussions similaires

  1. Pointeur générique (void *)
    Par c-candide dans le forum C
    Réponses: 22
    Dernier message: 25/02/2007, 02h52
  2. Pointeur générique vers d'autres types d'objets
    Par LapinGarou dans le forum MFC
    Réponses: 11
    Dernier message: 15/09/2006, 16h48
  3. déréférencer un pointeur générique ?
    Par tintin72 dans le forum C
    Réponses: 6
    Dernier message: 23/07/2006, 12h40
  4. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  5. pointeur générique
    Par ghostdog dans le forum C
    Réponses: 14
    Dernier message: 09/11/2005, 15h23

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