Как правильно преобразовать тип указателя для поплавков C в Racket? - PullRequest
1 голос
/ 13 апреля 2019

В документации Racket есть целочисленные типы указателей, такие как _intptr, но как мне использовать float *, скажем, из динамической библиотеки C?

1 Ответ

4 голосов
/ 14 апреля 2019

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-шляпу, со всей связанной с указателем паранойей заботой и вдумчивостью, которая идет с этим.

...