Разбира се, отговорът е по някакъв начин да преминете/вземете непрекъснат блок от паметта, така че въпросът е повече за това как да направите това. Засега все още мога да избегна проблема, като напиша функции за обвивка от страна на 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