# Wrapping up C function in Julia

**URL:** <https://discourse.julialang.org/t/wrapping-up-c-function-in-julia/15979>\
**Category:** New to Julia\
**Tags:** ccall\
**Created:** [October 6, 2018, 10:21pm UTC](https://discourse.julialang.org/t/wrapping-up-c-function-in-julia/15979 "2018-10-06T22:21:34Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![axline](https://avatars.discourse-cdn.com/v4/letter/a/dbc845/32.png) [@axline](https://discourse.julialang.org/u/axline)\
**Post date:** [October 6, 2018, 10:21pm UTC](https://discourse.julialang.org/t/wrapping-up-c-function-in-julia/15979/1 "2018-10-06T22:21:34Z")

</div>

Hello! Another total noob here 🙂

I’m wrapping up some C code in Julia and got stuck at one point.  
There’s a function:

```julia
extern void gsw_ct_first_derivatives (double sa, double pt, double *ct_sa, double *ct_pt);

```

How do I call it from Julia? I can’t find any appropriate ccal structure. Any input will be highly appreciated.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [October 7, 2018, 3:17am UTC](https://discourse.julialang.org/t/wrapping-up-c-function-in-julia/15979/2 "2018-10-07T03:17:44Z")

</div>

```julia
# Instructions
# gcc -fPIC -shared c2.c -o c2.so
# where c2.c contains the following code:
# /* ======================================================================= */
# #include <math.h>

# void gsw_ct_first_derivatives (double sa, double pt, double *ct_sa, double *ct_pt)
# {
# *ct_sa = 2 * sa;
# *ct_pt = 3 * pt;
# }
# /* ======================================================================= */

using Libdl

_C2LIB = dlopen("./c2.so")

sa = -13.0
pt = +2.0
ct_sa = Ref{Cdouble}(0.0)
ct_pt = Ref{Cdouble}(0.0)

ccall(dlsym(_C2LIB, :gsw_ct_first_derivatives), 
        Cvoid, 
        (Cdouble, Cdouble, Ptr{Cdouble}, Ptr{Cdouble}), 
        sa, pt, ct_sa, ct_pt)
@show sa, pt, ct_sa[], ct_pt[]

```

Produces output

```julia
julia> include("j2.jl")
(sa, pt, ct_sa[], ct_pt[]) = (-13.0, 2.0, -26.0, 6.0)
(-13.0, 2.0, -26.0, 6.0)

```

---

<div class="post-metadata">

**Author:** ![axline](https://avatars.discourse-cdn.com/v4/letter/a/dbc845/32.png) [@axline](https://discourse.julialang.org/u/axline)\
**Post date:** [October 7, 2018, 1:21pm UTC](https://discourse.julialang.org/t/wrapping-up-c-function-in-julia/15979/3 "2018-10-07T13:21:10Z")

</div>

> [@PetrKryslUCSD](#):
>
> using Libdl

Great, thank you very much, Petr! Here’s my slightly modified code (works with Julia 1.0.1):

```julia
if Sys.islinux()
  const libgswteos = joinpath(@ __DIR__ , "libgswteos-10.so")
end
if Sys.iswindows()
  const libgswteos = joinpath(@ __DIR__ , "libgswteos-10.dll")
end

function gsw_ct_first_derivatives(sa, pt)
  ccall(("gsw_ct_first_derivatives",libgswteos),Cvoid,(Cdouble, Cdouble, Ptr{Cdouble}, Ptr{Cdouble}),sa, pt, ct_sa, ct_pt)
return ct_sa[], ct_pt[]
end

sa=34.
pt=20.
ct_sa = Ref{Cdouble}(0.0)
ct_pt = Ref{Cdouble}(0.0)

ct_sa[], ct_pt[] = gsw_ct_first_derivatives(sa, pt)
@show sa, pt, ct_sa[], ct_pt[]

```
