2012-06-05 3 views
10

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

+0

Вы ищете что-то вроде [этого] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –

+0

Просто для подтверждения: вы хотите передать структуру по значению, а не ссылку? –

+0

@ Да, да, это правильно. – Cubic

ответ

12

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

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

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

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

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

Вы можете использовать их, чтобы сделать tricky low level stuff вот так.

+3

Спасибо, что связали этот блог - у него много действительно полезного материала. – Crashworks

Смежные вопросы