I would expect gibbrrish at first because the memory is uninitialized. What
version of Julia? Passing structs by value doesn't work on 0.3. Also note
that you will need to reload the particles ptr any time you read from it
because realloc can invalidate the pointer.
On Jun 21, 2015 10:42 AM, "Daniel Carrera" <[email protected]> wrote:
> Hello,
>
> I'm trying to learn how to call C libraries from Julia. So I wrote a
> simple C library that does nothing in particular and I am having trouble
> talking to that library from Julia. Here is my library:
>
> ---------------------------------------------
> % cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
>
> int N = 7;
> int Nmax = 9;
>
> struct particle {
> double x;
> double y;
> double z;
> };
>
> struct particle* particles = NULL;
>
> void particles_add(struct particle pt){
> while (Nmax <= N){
> Nmax += 128;
> particles = realloc(particles,sizeof(struct particle)*Nmax);
> }
> particles[N] = pt;
> N++;
> }
>
> ---------------------------------------------
> % make
> gcc -Wall -std=c99 -Wpointer-arith -c -fPIC foo.c
> gcc -Wall -std=c99 -Wpointer-arith -shared -o libfoo.so foo.o
> ---------------------------------------------
>
>
> So, there are two things I would like to do from Julia: I'd like to read
> the variable "N" and I'd like to create a "particle" struct and pass it to
> the "particles_add()" function. I used the documentation on this page:
>
> http://julia.readthedocs.org/en/latest/manual/calling-c-and-fortran-code/
>
> Based on what I read, this is what I came up with:
>
> ---------------------------------------------
> % cat foo.jl
> const lib = "./libfoo.so"
>
> N() = unsafe_load(cglobal(("N" ,lib), Cint), 0)
> Nmax() = unsafe_load(cglobal(("Nmax",lib), Cint), 0)
>
> immutable Particle
> x ::Cdouble
> y ::Cdouble
> z ::Cdouble
> end
>
> function add(pt::Particle)
> ccall(("particles_add", lib), Void, (Particle,), pt)
> end
>
> function add(;x=0,y=0,z=0)
> add(Particle(x,y,z))
> end
> ---------------------------------------------
>
>
> However, nothing here works: I cannot read "N" (I get gibberish) and I
> cannot call "particles_add()" (I get a segfault):
>
> ---------------------------------------------
> % julia
> ...
> julia> include("foo.jl")
> add (generic function with 2 methods)
>
> julia> N()
> 32570
>
> julia> Nmax()
> 7
>
> julia> add(x=0)
>
> signal (11): Segmentation fault
> particles_add at ./libfoo.so (unknown line)
> julia_add_20314 at (unknown line)
> jlcall_add_20314 at (unknown line)
> unknown function (ip: -490800184)
> unknown function (ip: -490804016)
> unknown function (ip: -490736582)
> jl_f_top_eval at /usr/bin/../lib/x86_64-linux-gnu/julia/libjulia.so
> (unknown line)
> eval_user_input at REPL.jl:53
> jlcall_eval_user_input_20278 at (unknown line)
> jl_apply_generic at /usr/bin/../lib/x86_64-linux-gnu/julia/libjulia.so
> (unknown line)
> anonymous at task.jl:95
> jl_handle_stack_switch at
> /usr/bin/../lib/x86_64-linux-gnu/julia/libjulia.so (unknown line)
> julia_trampoline at /usr/bin/../lib/x86_64-linux-gnu/julia/libjulia.so
> (unknown line)
> unknown function (ip: 4199613)
> __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
> unknown function (ip: 4199667)
> unknown function (ip: 0)
> zsh: segmentation fault (core dumped) julia
> ---------------------------------------------
>
>
> So, at this point I am really stuck. Clearly I have missed a lot of
> fundamental issues in either my C code, or my Julia code, or both. Can
> anyone figure out what I'm doing wrong?
>
>
> Cheers,
> Daniel.
>