[ocaml-ctypes] Finalising data
Jeremy Yallop
yallop at gmail.com
Wed May 28 03:47:28 BST 2014
On 27 May 2014 01:21, Florian Pichlmeier <florian.pichlmeier at mytum.de> wrote:
> i changed the representation of zframe_t
>
> type frame
> type t = frame structure ptr
> let zframe_t : frame structure typ = structure "_zframe_t"
Looks good!
>> Although 'zframe_t' is incomplete, 'ptr zframe_t' (i.e. zframe_t*) is
>> complete, so pointer arithmetic (with +@ etc.) should work as you
>> expect.
>
> I tried this approach with pointer arithmetic (+@), but i still get
> the Static.IncompleteType exception when i call the destroy function.
>
> let destroy (msg : t) =
> let stub = foreign "zframe_destroy" ((ptr zframe_t) @-> returning int) in
> stub (msg +@ 0)
>
> Another problem is, that the zframe_destroy function expects **zframe_t as input,
> but with msg +@ 0 i only get *zframe_t. Does it suffice to declare the function
> like i did above, or do i need another approach?
Right: this is the source of the difficulty. The argument to the C
function is a pointer to pointer:
void zframe_destroy(frame_t **)
and so the argument in the ctypes binding needs two 'ptr' applications:
let stub = foreign "zframe_destroy" (ptr (ptr zframe_t) @-> returning void)
In order to call the function you'll need to store the argument in
addressable memory. For example, you might write:
let p = allocate (ptr zframe_t) msg in
stub p
Jeremy.
More information about the Ctypes
mailing list