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