Конечно, ответ заключается в том, чтобы как-то передать/забрать непрерывный блок памяти, поэтому вопрос больше о том, как это сделать. На данный момент я все еще могу избежать этой проблемы, написав функции-оболочки на стороне C, но это не очень надежное решение.
Haskell FFI — как обрабатывать функции C, которые принимают или возвращают структуры вместо указателей на структуры?
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
Спасибо за ссылку на этот блог - там много действительно полезного материала.
- person Crashworks; 06.06.2012