
Envoyé par
bacelar
Donc On remplace
- "struct Point" c++ par une "struct Point" C
- string const &s1 pas LPCSTR
- string par quelque chose en accord avec les paradigmes de partages de données de l'API C.
Donc si je suis bien ton raisonnement, ta fonction aura comme prototype une truc comme :
CodeDeRetour doSomethingWrapper(char const *s1, PointWrapper p, char **result);
Et tu auras du :
Avant de faire quoi que ce soit :
- Définir une structure PointWrapper
Côté appelant :
- Copier les données de Point dans PointWrapper
- Récupéré le c_str de la chaîne passée en entrée
- Appeler la fonction de wrapping
Dans la fonction de wrapping :
- Appeler la fonction C++ wrappée
- Allouer une zone de mémoire pour stocker le résultat
- Gérer les possibilités d'échec de cette allocation
- Copier le résultat dans cette zone
- Tout en t'assurant que si une exception est émise par la fonction wrappée, elle sera attrapée et transformée en code d'erreur de retour de la fonction
Au retour de l'appel de la fonction de wrapping :
- Vérifier le code de retour, retransformer le code de retour en exception (chose impossible de manière générique dans l'absolu, voir mon autre post)
- Créer une chaîne à partir de la zone de mémoire remplie par le résultat
- Effacer cette zone de mémoire
Ton wrapping a quand même causé l'écriture de pas mal de code supplémentaire, pour une fonction très simple, et a demandé une allocation mémoire et une copie de chaîne, ainsi que la création d'un wrapper de point et une copie aussi.
C'est ce que je voulais dire en disant qu'il y a un coût. Dans beaucoup de cas, si je travaille sur un environnement où un compilateur est en quasi-monopole, je préfère pour ma part dire : Vous devrez faire votre code avec tel compilateur, et telles options. C'est finalement moins contraignant.
Partager