से निपटने के लिए ओकैमल सीटीपीएस बेवकूफ तरीका मैं कुछ सी कार्यों के लिए ओकैमल रैपर लिख रहा हूं जो आउट-पैरामीटर मुहावरे का उपयोग करते हैं और एक त्रुटि कोड लौटाते हैं। मैं Ctypes.allocate_n
का उपयोग कर ओकैमल पक्ष पर एक सी सरणी आवंटित करके उन्हें लपेट रहा हूं। और फिर सामग्री को ओकैमल प्रकार में कॉपी करना।आउट पैरामीटर
मुझे लगता है कि मैं एक समस्या के आसपास हैकिंग कर रहा हूं कि Ctypes
या कुछ अन्य मॉड्यूल पहले से ही एक और तरीके से हल हो रहा है, यहां एक उदाहरण है।
int gethostname(char *name, size_t len);
यहाँ लिपटे gethostname
समारोह के लिए out_parameter.mli
है:
gethostname(2)
निम्न प्रकार है।
val gethostname : int -> [> `Ok of string | `Error of int];;
यहाँ कार्यान्वयन है
open Core.Std;;
let (@->) = Ctypes.(@->);;
let returning = Ctypes.returning;;
open Foreign;;
let gethostname size =
let size' = Unsigned.Size_t.of_int size in
let c_gethostname =
foreign "gethostname" (Ctypes.ptr Ctypes.char @-> Ctypes.size_t @-> returning Ctypes.int) in
let buf = Ctypes.allocate_n Ctypes.char ~count:size in
let err = c_gethostname buf size' in
match err with
| 0 -> (
`Ok (Ctypes.string_from_ptr buf ~length:size)
)
| _ -> `Error err;;
let main() =
Printf.printf "%s\n" (match gethostname 1000 with
| `Ok hostname -> hostname
| `Error _ -> "error getting hostname");;
let() = main();;
और compeleteness की खातिर मैं इस आदेश के साथ out_parameter.native
संकलित।
$ corebuild -pkg ctypes.foreign out_parameter.native
कोड काम करता है और पीछे हटने वाले नल बाइट्स के साथ होस्टनाम लौटाता है।
$ ./out_parameter.native
MY-HOSTNAME
$ ./out_parameter.native | sed -e 's/\x0/@/g'
MY-HOSTNAME