Haskell FFI — как обрабатывать функции C, которые принимают или возвращают структуры вместо указателей на структуры?

Конечно, ответ заключается в том, чтобы как-то передать/забрать непрерывный блок памяти, поэтому вопрос больше о том, как это сделать. На данный момент я все еще могу избежать этой проблемы, написав функции-оболочки на стороне C, но это не очень надежное решение.


person Cubic    schedule 05.06.2012    source источник
comment
Вы ищете что-то вроде этого.   -  person dan_waterworth    schedule 05.06.2012
comment
Просто для подтверждения: вы хотите передать структуру по значению, а не по ссылке?   -  person Don Stewart    schedule 06.06.2012


Ответы (1)


FFI не поддерживает произвольную передачу по значению хранимых типов Haskell.

Вы можете передавать только значения типа (и некоторые из них являются указателями):

Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.

Итак, чтобы передать структуру, вы должны обернуть вызов через C-обертку; который принимает указатель и передает его значение функции C, которую вы действительно хотите вызвать.

Недавнее расширение GHC позволяет выполнять импорт "primop", который обходит механизм FFI и поддерживает произвольные соглашения о вызовах и передачу структур через неупакованные кортежи. Например.

foreign import prim "ITCHv41_run"
  parseITCHv41# :: Addr# -> Word#
                -> (# Int#, Word#, Word#, Word#, Word#, Word# #)

Вы можете использовать их для выполнения сложных низкоуровневых задач< /а> вот так.

person Don Stewart    schedule 05.06.2012
comment
Спасибо за ссылку на этот блог - там много действительно полезного материала. - person Crashworks; 06.06.2012