# Using a Base.CFunction in ccall

**URL:** https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621
**Category:** General Usage
**Created:** [August 17, 2018, 1:15pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621 "2018-08-17T13:15:38Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [August 17, 2018, 1:15pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/1 "2018-08-17T13:15:38Z")

</div>

I want to do something like this, inside a `begin` block:

```julia
begin
    f(x) = x * x
    ptr = @cfunction(f, Cdouble, (Cdouble,))
    g(x) = ccall(ptr, Cdouble, (Cdouble,), x)
    g(1.2)
end

```

However this gives the following error:

```julia
ERROR: LoadError: UndefVarError: f not defined

```

I’ve been suggested by @kristoffer.carlsson to use `$f` in `@cfunction`, thus resulting in the creation of `Base.CFunction`. However, I don’t understand ho to use in a `ccall`. I couldn’t find any such example in Julia’s `Base`. `Base.CFunction`’s docstring reads:

> Like all `cfunction` handles, it should be passed to `ccall` as a `Ptr{Cvoid}`, and will be converted automatically at the call site to the appropriate type.

How to convert a `Base.CFunction` to `Ptr{Cvoid}`? `convert` and `Base.cconvert` don’t work, but `Base.unsafe_convert` may do the trick. Is this the way to go (i.e., `ccall(Base.unsafe_convert(Ptr{Cvoid}, ptr), ...)`)?

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [August 30, 2018, 9:46pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/2 "2018-08-30T21:46:41Z")

</div>

Does anyone have a clue about how to do this?

---

<div class="post-metadata">

### Author: ![cdsousa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cdsousa/32/215553_2.png) [@cdsousa](https://discourse.julialang.org/u/cdsousa)
#### Post date: [August 30, 2018, 11:42pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/3 "2018-08-30T23:42:42Z")

</div>

Is there some problem due to be inside the begin end block?  
Anyway, just to confirm, are you aware of the qsort example [https://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/#Creating-C-Compatible-Julia-Function-Pointers-1](https://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/#Creating-C-Compatible-Julia-Function-Pointers-1), right?

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [August 31, 2018, 9:25am UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/4 "2018-08-31T09:25:37Z")

</div>

> [@cdsousa](#):
>
> Is there some problem due to be inside the begin end block?

Yes, I need to do this inside a begin-end block, specifically it’s in a `@testset`.

> [@cdsousa](#):
>
> Anyway, just to confirm, are you aware of the qsort example [https://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/#Creating-C-Compatible-Julia-Function-Pointers-1](https://docs.julialang.org/en/stable/manual/calling-c-and-fortran-code/#Creating-C-Compatible-Julia-Function-Pointers-1), right?

Yes, I know that example and I’ve used callbacks in `Cuba.jl`. However, here there is no callback, I just want to `ccall` a very simple function defined with `@cfunction`

---

<div class="post-metadata">

### Author: ![cdsousa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cdsousa/32/215553_2.png) [@cdsousa](https://discourse.julialang.org/u/cdsousa)
#### Post date: [August 31, 2018, 1:41pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/5 "2018-08-31T13:41:41Z")

</div>

Oh, that’s true, I had not read your original question very carefully.

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [November 5, 2018, 11:06pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/6 "2018-11-05T23:06:38Z")

</div>

Bump. Does anyone know how to do this?

---

<div class="post-metadata">

### Author: ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)
#### Post date: [November 6, 2018, 12:26am UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/7 "2018-11-06T00:26:09Z")

</div>

```julia
(edited, see next comment for the correct solution)
julia> function f end
       begin
           global f
           f(x) = x * x
           ptr = @cfunction(f, Cdouble, (Cdouble,))
           g(x) = ccall(ptr, Cdouble, (Cdouble,), x)
           g(1.2)
       end
1.44

```

---

<div class="post-metadata">

### Author: ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)
#### Post date: [November 6, 2018, 12:55am UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/8 "2018-11-06T00:55:36Z")

</div>

No that’s not a closure (If you don’t need a closure then that’s fine but in that case you should use `function f end` instead of defining a dummy method).

```julia
julia> let f = (x)->x * x
           ptr = @cfunction $f Cdouble (Cdouble,)
           GC.@preserve ptr ccall(Base.unsafe_convert(Ptr{Cvoid}, ptr), Cdouble, (Cdouble,), 2.0)
       end
4.0

```

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [November 6, 2018, 6:04pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/9 "2018-11-06T18:04:06Z")

</div>

Ok, so `Base.unsafe_convert` was indeed the way to go, I was missing the `GC.@preserve`. Thank you!

---

<div class="post-metadata">

### Author: ![system](https://global.discourse-cdn.com/julialang/original/3X/1/2/12829a7ba92b924d4ce81099cbf99785bee9b405.png) [@system](https://discourse.julialang.org/u/system)
#### Post date: [November 18, 2018, 6:04pm UTC](https://discourse.julialang.org/t/using-a-base-cfunction-in-ccall/13621/10 "2018-11-18T18:04:12Z")

</div>

This topic was automatically closed 12 days after the last reply. New replies are no longer allowed.
