2016-07-01 6 views
1

C++에서 Julia 함수를 호출하고 싶습니다. 이 줄리아 함수는 다른 줄리아 함수를 인수로 사용합니다 (콜백 함수). 이 콜백 함수를 C++로 작성하고 Julia의 네임 스페이스에서 다른 기본 유형을 전달하는 것과 같은 이름을 선언하지 않고 Julia에 직접 전달하려고합니다. 콜백 함수의 C++ 구현에 대한 인수는 해당 형식으로 jl_value_t * 일 것입니다.Julia 콜백 함수를 인수로 취하는 C++에서 Julia 함수 호출

아무에게도 어떻게 할 수 있습니까? embedded Julia example은 꽤 좋지만이 사례를 설명하지는 않습니다.

업데이트 : Yakk의 답변을 바탕으로 수정 및 명확히 함.

답변

2

이 예에서는이 사례를 다룹니다.

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

예의 상단 정의된다

여기서 우리는 C 함수를 호출한다.

다른 곳에서는 줄리아 기능을 정의하는 예가 있습니다. C 코드에 ccall을 정의하는 것을 정의하십시오.

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

(제외하는 대신 2*xccall(blah)을한다).

julia 함수를 가져 와서 포인터를 가져옵니다 (연결된 예제에서도 마찬가지입니다).

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

콜백이 필요한 줄리아 함수에 전달하십시오. 또는 평가판을 사용하여 이름으로 전달하십시오.

C++ 코드는이 계획과 함께 double 등이 전달됩니다.

+0

응답 해 주셔서 감사합니다. 그래서이 방법이 효과가 있다는 것을 알았지 만 Julia의 네임 스페이스 (예 :'my_func')에 새로운 함수를 만들지 않고 그것을하고 싶습니다. 플로트와 ints를 위해 그렇게 작동하기 때문에 그것은 그런 식으로 깨끗해 보이고 기능을 위해서도 가능할 것 같습니다 --- 그들은 boxed를 얻고 글로벌 Julia 핸들을 만들지 않고 Julia로 넘어갔습니다. 그것은 기능을 위해서도 가능한가? – Jeff

+0

네임 스페이스가 문제가되는 이유는 무엇입니까? 그냥 암호 생성기를 사용하여 vyQMNzqlL0ww9HCgjWBuqXmzRSvcaEeSSfnufJkvmzASjHcmOea3zDgLiVNMMaa – ivarne

+0

과 같은 이름을 얻으십시오. 효율성이 문제가된다고 생각되면 아마도 모든 언어를 동일한 언어로 작성하거나 julia 함수를 직접 작성하여 함수를 직접 호출해야합니다. (매크로가 psudo를 동적으로 만들 수 있습니다.) – ivarne