2009-06-06 2 views
1

새로운 응용 프로그램에서 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 환경에 전달하는 것입니다.

감사합니다.

답변

3

먼저 Cmalloced 값을 추상 유형으로 ocaml에 전달할 수 있습니다.

  • 당신은 가비지 컬렉터를 해제하지 않습니다
  • C에 정의 된 외부 함수를 사용하지 않고 OCaml의에서 추상적 인 값을 조작 할 수 있으며, 메모리 누수가있을 수 있습니다 (또는 사용 : 그들의 severall 문제는이 함께있는 일부 외부 함수를 명시 적으로 해제하지만 ocaml의 유용성 일부를 잃게 됨)

포인터를 포함하는 사용자 정의 블록을 사용할 수도 있습니다. 이것은 bastract 값이기도하지만 (앞의 경우와 같이) 사용자 정의 블록이 GCed 될 때 호출 할 코드를 추가 할 수 있습니다. 그러면 C 객체를 해제 할 수 있습니다.

은 그런 정수/문자의 배열/당신이 포장 할 수있는 이미 할당 된 C 나 포트란 배열에 biggaray 라이브러리 "A 포인터 P가 있고 alloc_bigarray 또는 alloc_bigarray_dims 기능을 사용하여 큰 배열로 CAML로 돌아 떠. " the manual

+0

을 참조하십시오. 그 연결은 내가 필요한 것입니다. 고마워요! – alvatar

+0

당신은 확실히 bigarrays 싶습니다. 하지만 remi, 가비지 컬렉터가 추상적 인 유형을 자유롭게 할 것입니다. 왜 C로 사용자 정의 연산 구조가 있고 GC로 등록하기 위해 호출한다고 생각합니까? – nlucaroni

+0

malloc은 caml 힙 외부로 메모리를 할당하고 caml은 힙 외부에서 GC를 수행하지 않습니다. 따라서 추상적 인 값이 malloced 메모리에 대한 C 포인터 인 경우 caml은 메모리를 해제하지 않습니다. 사용자 정의 블록은 GCed하지만 순수한 malloced C 포인터는 아닙니다. –

관련 문제