# Julia analogue of C struct?

**URL:** <https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198>\
**Category:** New to Julia\
**Tags:** ccall\
**Created:** [January 6, 2018, 3:20pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198 "2018-01-06T15:20:53Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![1112](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/1112/32/9325_2.png) [@1112](https://discourse.julialang.org/u/1112)\
**Post date:** [January 6, 2018, 3:20pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/1 "2018-01-06T15:20:53Z")

</div>

C

```julia
typedef struct {
    unsigned char data [64];
} my_pubkey;

```

Julia?

---

<div class="post-metadata">

**Author:** ![1112](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/1112/32/9325_2.png) [@1112](https://discourse.julialang.org/u/1112)\
**Post date:** [January 6, 2018, 3:22pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/2 "2018-01-06T15:22:09Z")

</div>

Всем привет!  
Как преобразовать тип для ccall?  
Вот код на C

```julia
typedef struct {
    unsigned char data [64];
} my_pubkey;

```

that’s what I was trying to do on Julia

```julia
struct pubkey
    Cuchar::NTuple{64, Int}
end

private_key = 7

pub = ccall((:secp256k1_ec_pubkey_create, "/usr/local/lib/libsecp256k1.so"), Int, (Pair{Int64, Int64}, Ref{pubkey}, Int32), secp256k1_ctx, pubkey, private_key)

```

---

<div class="post-metadata">

**Author:** ![ScottPJones](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scottpjones/32/146_2.png) [@ScottPJones](https://discourse.julialang.org/u/ScottPJones)\
**Post date:** [January 6, 2018, 3:56pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/3 "2018-01-06T15:56:55Z")

</div>

You should use either `UInt8` or `Cuchar`, not `Int`, in the `NTuple`, to match the C definition, i.e., also it’s better not to use a Julia type for a field name, i.e.

```julia
struct my_pubkey
    data::NTuple{64, Cuchar}
end

```

will exactly match the C definition.

---

<div class="post-metadata">

**Author:** ![1112](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/1112/32/9325_2.png) [@1112](https://discourse.julialang.org/u/1112)\
**Post date:** [January 6, 2018, 5:50pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/4 "2018-01-06T17:50:38Z")

</div>

Thank you!  
And how to correctly pass the argument to the pubkey in call?  
type of data use nothing?

```julia

struct secp256k1_pubkey
    data::NTuple{64, Cuchar}
end

pubkey = secp256k1_pubkey
private_key = 7

pub = ccall((:secp256k1_ec_pubkey_create, "/usr/local/lib/libsecp256k1.so"), Int, (Pair{Int64, Int64}, nothing, Int32), secp256k1_ctx, pubkey, private_key)

function should change pubkey (&pubkey)

```

---

<div class="post-metadata">

**Author:** ![ScottPJones](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scottpjones/32/146_2.png) [@ScottPJones](https://discourse.julialang.org/u/ScottPJones)\
**Post date:** [January 6, 2018, 6:16pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/5 "2018-01-06T18:16:11Z")

</div>

You should use triple backquotes, followed by julia, to quote code in Discourse (and end it with a line with triple backquotes).  
You are setting `pubkey` to the _type_ `secp256k1_pubkey`, not to an instance of it.  
I think that to pass to C, you should create a `Ref{secp256k1_pubkey}()`. (you used to be able to use a &, like C, which was special syntax only for `ccall`, but I believe that’s been removed).

---

<div class="post-metadata">

**Author:** ![Liso](https://avatars.discourse-cdn.com/v4/letter/l/898d66/32.png) [@Liso](https://discourse.julialang.org/u/Liso)\
**Post date:** [January 7, 2018, 12:32pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/6 "2018-01-07T12:32:20Z")

</div>

You should use triple backquotes, ~~followed by julia,~~ to quote code…

---

<div class="post-metadata">

**Author:** ![ScottPJones](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scottpjones/32/146_2.png) [@ScottPJones](https://discourse.julialang.org/u/ScottPJones)\
**Post date:** [January 7, 2018, 1:00pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/7 "2018-01-07T13:00:14Z")

</div>

Well, I was talking specifically about the code @1112 first posted, of course.  
More generally, triple backquotes followed by the name of a (supported) language, such as julia, c, python, etc.

---

<div class="post-metadata">

**Author:** ![Liso](https://avatars.discourse-cdn.com/v4/letter/l/898d66/32.png) [@Liso](https://discourse.julialang.org/u/Liso)\
**Post date:** [January 7, 2018, 1:59pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/8 "2018-01-07T13:59:49Z")

</div>

You are right! 🙂 I just want to say that you don’t need to specify julia because it seems to be default on this discourse forum.

---

<div class="post-metadata">

**Author:** ![ScottPJones](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scottpjones/32/146_2.png) [@ScottPJones](https://discourse.julialang.org/u/ScottPJones)\
**Post date:** [January 7, 2018, 2:35pm UTC](https://discourse.julialang.org/t/julia-analogue-of-c-struct/8198/9 "2018-01-07T14:35:07Z")

</div>

I hadn’t even realized that you could set a forum specific default… good to know! Thanks!
