[C++-sig] Re: Defining Policies for unknown data handles
Lutz Paelike
lutz_p at gmx.net
Sun Apr 6 14:30:37 CEST 2003
> Lutz Paelike wrote:
>
>> Hi all,
>
>
> Hi Lutz,
>
>> i'm starting with boost python and also tried the great pyste tool
>> to make some python bindings.
>>
>> I have a question, which seems not too difficult for me, but i'm
>> not sure which is the right way to go..
>>
>> I have a commercial application with an interface i like to use.
>> There are a couple of structures and functions defined. Some of
>> them use a pointer to a hidden structure returned by a initalizing
>> function. I don't need to know anything about the struct , i just
>> pass it on to other functions to refer to the internal data.
>>
>> It's going like this:
>>
>> 1. Definition of data handle:
>>
>> typedef struct _CapChannel *CapChannel; /* Opaque pointer to a
>> channel*/
>>
>> 2. Get Handle
>>
>> CapChannel CapCreateChannel _PROTO((char *name, CapChannelUsage
>> usage, int data_type)); 3. Use Handle
>>
>> int CapSetData _PROTO((CapChannel channel, void *data));
>>
>>
>> You get the picture...
>>
>> So when i use pyste to generate the boost python interface code it
>> gives a warning:
>>
>> ---> Error: CapCreateChannel returns a pointer or a reference, but
>> no policy was specified.
>>
>> This makes perfect sense for me, as Pyste/Boost Python don't know
>> how to deal with this reference. The question for me is now which
>> is the right policy to use and how do i define this correctly? I
>> don't need access to _CapChannel from Python. I just want to store
>> the pointer.
>
>
> Just set the correct policy for CapCreateChannel:
>
> f = Function('CapCreateChannel', ...) set_policy(f,
> return_value_policy(return_opaque_pointer))
>
> Note: pyste didn't support return_opaque_pointer until version 0.6.5,
> which I just commited to CVS.
>
> Hope that helps, Nicodemus.
I'm sorry, that did not work completely. And maybe i found a (small) bug
in pyste..
When i use the following as you suggested:
f= Function("CapCreateChannel","mocapserver.h")
set_policy(f, return_value_policy(return_opaque_pointer))
i get
-----------------------------------
Traceback (most recent call last):
File "p:\Dev\boost_1_30_0\libs\python\pyste\src\pyste.py", line 194, in ?
status = Main()
File "p:\Dev\boost_1_30_0\libs\python\pyste\src\pyste.py", line 151,
in Main
execfile(interface, context)
File "mcp.pyste", line 42, in ?
set_policy(f, return_value_policy(return_opaque_pointer))
NameError: name 'return_opaque_pointer' is not defined
---------------------------------
i figured out that you have a defined a variable called
return_opaque_pointer
and this var contains just the string "return_opaque_pointer"
so i used this instead:
f= Function("CapCreateChannel","mocapserver.h")
set_policy(f, return_value_policy('return_opaque_pointer'))
Now Pyste works, but still yields following warning:
------------------------------------------
mocapserver.h:205: type specifier omitted for parameter
mocapserver.h:205: parse error before `,' token
mocapserver.h:211: type specifier omitted for parameter
mocapserver.h:211: parse error before `)' token
---> Error: _CapChannel is forward declared. Please include the
appropriate header with its definition
Module mocap generated
2.19 seconds
---------------------------------------------
This is ok, because Pyste is right there is no definition of _CapChannel
as it's resolved by linking to the appropriate lib.
Pyste generated code, though. It looks like:
def("CapCreateChannel", &CapCreateChannel,
return_value_policy<return_opaque_pointer >());
But if i now compile this i get:
-----------------------------------------
cl /Zm800 -nologo -GX -c -DBOOST_PYTHON_DYNAMIC_LIB
-D_STLP_DO_IMPORT_CSTD_FUNCTIONS=1 -D_STLP_DEBUG=1
-D_STLP_DEBUG_UNINITIALIZED=1 /Z7 /Od /Ob0 /GX /GR /MDd
/IP:\Dev\STLport-4.5.3\stlport /IP:\Dev\boost_1_30_0
/IC:\Python22\include /IV:\include /I. /c mocap.cpp /Fomocap.obj
mocap.cpp
P:\Dev\boost_1_30_0\boost/python/opaque_pointer_converter.hpp(88) :
error C2440: 'return' : cannot convert from 'struct _CapChannel' to
'struct _CapChannel *& '
A reference that is not to 'const' cannot be bound to a non-lvalue
P:\Dev\boost_1_30_0\boost/python/opaque_pointer_converter.hpp(87) :
while compiling class-template member function 'struct _CapChannel
*&__cdecl boost::python::opaque_pointer_converter<struct _CapChannel
*>::execute(struct boost::python::opaque_pointer_converter<struct
_CapChannel *>::instance &) '
-------------------------------------------------
Suggestions?
Thanks a lot,
Lutz Paelike
More information about the Cplusplus-sig
mailing list