Racket FFI - функция обтекания, которая имеет тип возвращаемого списка через указатель и задает его длину путем изменения указателя параметра - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь обернуть функцию C

Color *ImageExtractPalette(Image image, int maxPaletteSize, int *extractCount);

Я сделал необработанную оболочку, но теперь я хочу также создать расширенную оболочку, чтобы она имела подпись

(_Image? integer? . -> . (listof _Color?))

, где _Image и _Color - это типы структур C, определенные с define-cstruct.

Я пробовал это (drl определяется с define-ffi-definer):

(drl ImageExtractPalette* 
     (_fun _Image _int (extract-count : [_ptr o _int]) -> (colors : [_list o _Color extract-count]) -> colors)
     #:c-id ImageExtractPalette)

Однако я получаю сообщение об ошибке

_fun: got an expression for a custom type that does not use it
  at: (colors : (_list o _Color extract-count))
  in: (_fun _Image _int (extract-count : (_ptr o _int)) -> (colors : (_list o _Color extract-count)) -> colors)

Документы для _list: https://docs.racket -lang.org / foreign / foreign_procedures.html #% 28form ._% 28% 28lib._ffi% 2Funsafe..rkt% 29 .__ список% 29% 29

...