2016-07-01 6 views
1

としてジュリア・コールバック関数を取るC++からジュリアの関数を呼び出します。このJulia関数は、別のJulia関数を引数として取ります(コールバック関数)。私はこのコールバック関数をC++でも書いて、Juliaの名前空間に他のプリミティブ型が渡される方法のような名前を宣言することなく、Juliaに直接渡したいと思います。おそらくコールバック関数の私のC++実装への引数は、その型としてjl_value_t *を持つでしょう。は、私はC++からジュリア関数を呼び出したいのですが、引数

これを行う方法の例を教えてもらえますか? embedded Julia exampleはかなり良いですが、このケースを説明していないようです。

更新:改訂とYakkの回答に基づいて明らかにしました。

答えて

2

この例では、このケースについて説明しています。

jl_eval_string("println(ccall(:my_c_sqrt, Float64, (Float64,), 2.0) 

例の先頭で定義されています

は、ここでは、C関数を呼び出します。

他の場所でジュリアの機能を定義するexampeがあります。あなたのCコードにccallを定義するものを定義してください。

jl_eval_string("my_func(x) = 2*x"); 

(代わりにの場合を除き、それはccall(blah)を行います)。

そのジュリア機能を取り、(またあなたのリンクの例では)それへのポインタを取得します。

jl_function_t *func = jl_get_function(jl_base_module, "reverse!"); 

そして、コールバックを期待するjulia関数に渡します。または、evalを使用して名前を渡します。

C++コードは、この計画にdouble Sを渡すなどします。

+0

ありがとうございました!だから私はこれがうまくいくと思っていますが、私はJuliaの名前空間(例えば、 'my_func')に新しい関数を作成せずにやりたいと思います。フロートとintsのためにそれが動作するので、それはより洗練されているように思えます。そして、それらはボックス化され、グローバルなJuliaハンドルを作成せずにJuliaに渡されます。それも機能のために可能ですか? – Jeff

+0

名前空間が問題になるのはなぜですか?単にパスワードジェネレータを使用してvyQMNzqlL0ww9HCgjWBuqXmzRSvcaEeSSfnufJkvmzASjHcmOea3zDgLiVNMMaa – ivarne

+0

のような名前をつけてください。効率が問題になると思われる場合は、すべて同じ言語で書いてください。あるいは、関数を直接呼び出すようにju​​lia関数を書き直してください。 (マクロがpsudoを動的にするかもしれません) – ivarne

関連する問題