[ocaml-ctypes] Finalising data

Florian Pichlmeier florian.pichlmeier at mytum.de
Mon May 26 17:21:02 BST 2014


Dear Jeremy,

i changed the representation of zframe_t

type frame
type t = frame structure ptr
let zframe_t : frame structure typ = structure "_zframe_t"

> 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?

Again, many thanks for your efforts.

Florian

Jeremy Yallop <yallop at gmail.com> wrote:


> Dear Florian,
> 
> On 19/05/2014, Florian Pichlmeier <florian.pichlmeier at mytum.de> wrote:
> 
> > But now i have encountered a new problem.
> > Zeromq uses incomplete types for many data types,
> > like the frame type
> > typedef struct _zframe_t zframe_t;
> > 
> > On the OCaml side i use void pointer to represent
> > these data types, and thats where the problem arose.
> > 
> > The frame destroy function call for example is that
> >     zframe_destroy (zframe_t **self_p);
> > with the corresponding ocaml function
> > 
> > let destroy (msg : t) =
> > let stub = foreign "zframe_destroy" (ptr void @-> returning int) in
> > stub (msg +@ 0)
> > 
> > The problem is the msg +@ 0 part.
> > 
> > 
> 
> The ctypes equivalent of zeromq's incomplete struct declaration is a
> call to the 'structure' function without a corresponding call to
> 'seal'.  For example, you can represent zframe_t as follows:
> 
>     (* struct _zframe_t *)
>     let zframe_t = structure "_zframe_t"
> 
> This allows you to give a more precise type to the zframe_destroy binding:
> 
>     let zframe_destroy = foreign "zframe_destroy"
>         (ptr (ptr zframe_t) @-> returning int)
> 
> 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 hope that helps,
> 
> Jeremy.
> 
> 
> 


More information about the Ctypes mailing list