새로운 응용 프로그램에서 OCaml과 C 코드의 조합을 사용하려고합니다. OCaml로에서 C 코드를 호출하면 간단한 것 같습니다 :OCaml에서 거대한 배열을 효율적으로 전달하는 C 함수를 호출 할 수 있습니까?
external name : type = C-function-name
을하지만, 주위에 (C에서 OCaml의 호출) 다른 방법으로도 보인다 더 복잡하다 :
static void
call_ocaml_void (const char * name)
{ CAMLparam0() ;
CAMLlocal1 (ostr) ;
ostr = caml_copy_string (name);
value * func = caml_named_value ("ocaml_puts") ;
if (func == NULL)
puts ("caml_named_value failed!") ;
else
caml_callback (*func, ostr) ;
CAMLreturn0 ;
} /* call_ocaml_void */
(예 이쪽으로부터 page)
그리고 특히 복사가 필요합니다.
두 언어의 데이터 구조에 대한 액세스를 허용 할 수있는 사람이 있습니까? 따라서 함수는 구조체에 대한 포인터 만 전달할 수 있지만 두 언어 모두 어쨌든 읽을 수 있습니다.
목표는 OCaml로 모든 작업을 수행 한 다음 데이터를 효율적인 방식으로 C 환경에 전달하는 것입니다.
감사합니다.
을 참조하십시오. 그 연결은 내가 필요한 것입니다. 고마워요! – alvatar
당신은 확실히 bigarrays 싶습니다. 하지만 remi, 가비지 컬렉터가 추상적 인 유형을 자유롭게 할 것입니다. 왜 C로 사용자 정의 연산 구조가 있고 GC로 등록하기 위해 호출한다고 생각합니까? – nlucaroni
malloc은 caml 힙 외부로 메모리를 할당하고 caml은 힙 외부에서 GC를 수행하지 않습니다. 따라서 추상적 인 값이 malloced 메모리에 대한 C 포인터 인 경우 caml은 메모리를 해제하지 않습니다. 사용자 정의 블록은 GCed하지만 순수한 malloced C 포인터는 아닙니다. –