Racket имеет встроенные представления типа _float
(и _double
) C, а также тип _pointer
.Вы можете комбинировать их, чтобы рассматривать возвращаемое значение как указатель C float
.
Что-то вроде этих строк (это эскиз - измените по мере необходимости в соответствии с вашей ситуацией):
Ваш Cfunction:
float* my_float_returner() {
float* pi = malloc(sizeof(float));
*pi = 3.1415926535;
return pi;
}
и оболочка Racket FFI:
(require ffi/unsafe
ffi/unsafe/define)
;; not strictly necessary, but probably a good reminder for yourself
(define _float-ptr _pointer)
;; registers the library and sets up the function to define interfaces to its contents
(define-ffi-definer define-my-lib (ffi-lib "my_library_path"))
;; defines the interface to your C function
(define-my-lib my_float_returner (_fun -> _float-ptr))
;; returns a _float object containing the dereferenced value returned by
;; my_float_returner
(ptr-ref (my_float_returner) _float)
Нет необходимости говорить, что указатели как нетипизированные таким образом могут быть опасными , иВы должны быть осторожны.
Я пойду так далеко, что процитирую документацию по интерфейсу внешней функции Racket * Самое первое предложение :
Несмотря на использованиеFFI не требует написания нового кода на C, он обеспечивает очень небольшую изоляцию от проблем, с которыми сталкиваются программисты на C, связанные с безопасностью и управлением памятью.
Если вы используете эти инструменты, вы должны иметь свою C-шляпу, со всей связанной с указателем паранойей заботой и вдумчивостью, которая идет с этим.