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 :

Création d'une API


Sujet :

C++

  1. #1
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut Création d'une API
    Bonjour,

    Je travaille sur la création de ma 1ere API pour contrôler un de mes modules. Etant donné que j'ai beaucoup de choses à contrôler, je passe des flags a plusieurs méthodes dont 2 qui peuvent être assimilées à un Set() et un Get().
    On pourrait écrire ça comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool Set(int ControlFlag, void* Value);
    bool Get(int ControlFlag, void* Value) const;
    void* permet de faire passer des types quelconques. L'utilisateur est sensé connaitre quel type devra être passé avec tel ou tel control flag.

    Exemple, un appel comme celui la permet de contrôler un path dans le module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define MY_PATH    1
    ...
    ...
    string MyPath="C:\\ToTo";
    Set(MY_PATH, const_cast<char *>(MyPath.c_str()));     // Set ne modifie jamais les données du void*
    Maintenant pour le Get, j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define MY_PATH    1
    ...
    ...
    char* pMyPath=NULL;
    Get(MY_PATH, &pMyPath);     // Get renvoie un pointeur interne du module
    string MyPath=pMyPath;
    Dans ce cas il ne faut surtout pas toucher au pointeur pMyPath et en faire une copie immédiatement.

    Je pense que la méthode Set est plus ou moins propre : absence de const, passage obligé par le const_cast pour les string stl.

    Le méthode Get me semble moche : possibilité de modifier le buffer interne au module si on ne fait pas attention. Si je demande la taille de la chaine au module, je dois faire une allocation de la chaine à passer, le module recopiera sa chaine dedans, et je devrais refaire une copie dans ma string stl puis un delete de ma chaine. Je préférais avoir un pointeur directement.

    J'aimerai avoir vos conseils d'experts sur ces mochetés
    Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Quel est l'avantage de ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set(MY_PATH, blabla);
    Set(MY_NUMBER, pwetpwet);
    Par rapport à ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetPath(blabla);
    SetNumber(pwetpwet);
    Si tu tiens vraiment à avoir des Get et des Set "génériques", fais-en au moins une version pour chaque type. Un peu comme le fait OpenGL par exemple :
    SetString(MY_PATH, blabla);
    SetInteger(MY_NUMBER, pwetpwet);
    Mais honetement, à part perdre du typage et faire un code crade, je ne vois aucun intérêt à utiliser des fonctions aussi génériques.

  3. #3
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    En fait c'est parceque je me retrouve avec des centaines de methodes Set/Get qui je trouve alourdissent le code. Il y en plus une couche entre les appels utilisateurs et les appels au module (gestion de threads) et je suis obligé de reporter toutes les fonctions dans cette interface. Là j'en ai simplement 4.

  4. #4
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Salut,

    Quand je parlais module je pensais DLL. Je ne voudrais pas avoir des centaines de fonctions dans cette DLL.

    J'ai vu une API de ce style, maximum 10 fonctions pour contrôler un module et c'est très propre, même dans le code interne (c'est une grosse boite de produits graphique qui fais ça, le code est nickel). Le hic c'est qu'il y a très peu de passage de string, quand on veut en récupérer une, on doit demander sa taille, allouer un buffer et le passer dans un second appel. C'est juste ce point que je trouve lourd.

    Je vais surmonter ça en supprimant les const_cast en me passant des string à l'appel. Pour le Get je vais devoir demander la taille et allouer un buffer temporaire.

    Merci pour les conseils Laurent.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Le hic c'est qu'il y a très peux de passage de string, quand on veut en récupérer une, on doit demander sa taille, allouer un buffer et le passer dans un second appel. C'est juste ce point que je trouve lourd.
    Retourne tout simplement une std::string.

  6. #6
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Retourne tout simplement une std::string.
    J'y avais pensé mais je voudrais garder juste des types de base pour que ce soit plus simple à interfacer avec d'autre langage comme le C#, VB etc.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Va donc dans le forum C.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Si tu veux interfacer avec les autres langages dont VB, je te conseille de retourner carrément une BSTR (qui s'obtient à partir d'une chaîne de wchar_t avec la fonction SysAllocString()).
    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.

Discussions similaires

  1. Création d'une API
    Par biyong dans le forum IGN API Géoportail
    Réponses: 0
    Dernier message: 17/04/2013, 12h23
  2. Création d'une API
    Par spottt dans le forum C#
    Réponses: 4
    Dernier message: 26/04/2012, 14h16
  3. Création d'une API
    Par worolf dans le forum Langage
    Réponses: 1
    Dernier message: 28/04/2008, 15h25
  4. Création d'une API / documentation
    Par oodini dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/12/2007, 23h01
  5. Création d'une API
    Par kabish dans le forum Langage
    Réponses: 9
    Dernier message: 11/10/2007, 15h56

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