Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

swig : problème sur un typedef de pointeur

2 réponses
Avatar
Sébastien Kirche
Bonjour,

je découvre swig et je souhaite prototyper un wrapper python pour une
bibliothèque (en fait une dll) dont j'ai également le .h (ça tombe bien).

Je bute sur un endroit du .h qui définit de nouveaux types et en même
temps des types pointeurs sur les types définis.
Exemple :
typedef enum pborca_type
{
PBORCA_APPLICATION,
PBORCA_DATAWINDOW,
PBORCA_FUNCTION,
PBORCA_MENU,
PBORCA_QUERY,
PBORCA_STRUCTURE,
PBORCA_USEROBJECT,
PBORCA_WINDOW,
PBORCA_PIPELINE,
PBORCA_PROJECT,
PBORCA_PROXYOBJECT,
PBORCA_BINARY

} PBORCA_TYPE, FAR *PPBORCA_TYPE;

Mon fichier d'interface est le suivant :
8<------8<------8<------8<------8<------8<------8<------8<------8<------
%module pborca
%{
#include "pborca.h"
%}

%include "pborca.h"
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Et je bute sur l'erreur
pborca.h(243): Error: Syntax error in input(1).

(La ligne 243 de pborca.h est le début du typedef suivant).

En cherchant un peu j'ai vu qu'on peu détailler les portions de l'api
qu'on souhaite exposer en n'incluant pas directement le .h avec la 2ème
directive include mais en spécifiant les fonctions ou les types.

Par essai et erreur j'ai vu que si je spécifie un typedef sans la partie
FAR * ça passe mais mon wrapper ne contient que ce type. Et je n'arrive
pas à définir mon type pointeur. De plus je devrais recopier tout le .h
dans le .i ?

Bref un peu d'aide serait la bienvenue.
Au cas où, l'interface pborca.h est disponible publiquement : c'est
prévu pour ouvrir les projets Powerbuilder à des outils externes.

Merci.
--
Sébastien Kirche

2 réponses

Avatar
Amaury Forgeot d'Arc
Bonsoir,

Bonjour,

je découvre swig et je souhaite prototyper un wrapper python pour une
bibliothèque (en fait une dll) dont j'ai également le .h (ça tombe bien).

Je bute sur un endroit du .h qui définit de nouveaux types et en même
temps des types pointeurs sur les types définis.
Exemple :
typedef enum pborca_type
{
PBORCA_APPLICATION,
PBORCA_DATAWINDOW,
PBORCA_FUNCTION,
PBORCA_MENU,
PBORCA_QUERY,
PBORCA_STRUCTURE,
PBORCA_USEROBJECT,
PBORCA_WINDOW,
PBORCA_PIPELINE,
PBORCA_PROJECT,
PBORCA_PROXYOBJECT,
PBORCA_BINARY

} PBORCA_TYPE, FAR *PPBORCA_TYPE;

Mon fichier d'interface est le suivant :
8<------8<------8<------8<------8<------8<------8<------8<------8<------
%module pborca
%{
#include "pborca.h"
%}

%include "pborca.h"
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Et je bute sur l'erreur
pborca.h(243): Error: Syntax error in input(1).

(La ligne 243 de pborca.h est le début du typedef suivant).

En cherchant un peu j'ai vu qu'on peu détailler les portions de l'api
qu'on souhaite exposer en n'incluant pas directement le .h avec la 2ème
directive include mais en spécifiant les fonctions ou les types.

Par essai et erreur j'ai vu que si je spécifie un typedef sans la partie
FAR * ça passe mais mon wrapper ne contient que ce type. Et je n'arrive
pas à définir mon type pointeur. De plus je devrais recopier tout le .h
dans le .i ?


Je pense que c'est à cause du mot FAR.
Swig ne connait que le C/C++ standard, pas les extensions/adaptations du
compilateur Microsoft. FAR doit dater de l'époque MS/DOS...
D'ailleurs, FAR est défini dans windows.h (ou windef.h), il suffit de
faire pareil ::

%module pborca

#define FAR
%{
#include "pborca.h"
%}

Tu auras peut-être besoin de faire d'autres choses semblables, comme ::
#define __declspec__()
Si un mot n'est pas nécessaire à Swig, un petit #define et basta!

--
Amaury Forgeot d'Arc

Avatar
Sébastien Kirche
Le 30 mai 2007 à 00:45, Amaury Forgeot d'Arc a formulé :

Je pense que c'est à cause du mot FAR.
Swig ne connait que le C/C++ standard, pas les extensions/adaptations
du compilateur Microsoft. FAR doit dater de l'époque MS/DOS...


Je ne sais pas si FAR est spécifique MS mais effectivement ça doit dater
du DOS et de la joie de programmer sur des segments mémoire de 64K.

D'ailleurs, FAR est défini dans windows.h (ou windef.h), il suffit de
faire pareil ::

%module pborca

#define FAR
%{
#include "pborca.h"
%}

Tu auras peut-être besoin de faire d'autres choses semblables, comme
::
#define __declspec__()
Si un mot n'est pas nécessaire à Swig, un petit #define et basta!


OK.

#define FAR a résolu le problème cité, mais ça bute maintenant ailleurs.
Je pense que ça doit pouvoir se résoudre de la même façon.

Merci du coup de main.
--
Sébastien Kirche