Hello!

I started experimenting with Julia<->C interface and found out that it 
seems to be hard to pass a struct defined in C to a callback function 
defined in Julia as follows:

type ab_struct
  a::Cint
  b::Cdouble
end

function const_ab_struct(a_::Cint, b_::Cdouble, c_::Ptr{ab_struct})
  c_ref = unsafe_pointer_to_objref(c_)
  c_ref.a = a_
  c_ref.b = b_
  return 0
  retval::Cint
end

const c_const_ab_struct = cfunction(const_ab_struct, Cint, (Cint, Cdouble,
Ptr{ab_struct}))
ccall( (:testme_ab_callback, "my_lib"), Void, (Ptr{Void},), 
c_const_ab_struct)

In "my_lib" dynamic library I have
typedef struct {
  int a;
  double b;
} ab_struct;

void testme_ab_callback(int (*fun)(int, double, ab_struct*))
{
  ab_struct foo;
  fun(1,0.5,&foo);
  printf("%i, %f\n", foo.a, foo.b);
}

This will yield segfault (seemingly) from c_ref.a=a_ (I'm using osx 10.10 
and julia version 0.3.5 installed from .dmg)

Am I doing something wrong (which is a more probable than..)? Is this kind 
of struct-callback construct possible to implement (cleanly)? 

Thanks,
Juhani

Reply via email to