Haskell FFI: вызов FunPtrs

Должно быть так:

var jobject = JsonConvert.DeserializeObject(jsonstring);

Вы можете вставить сюда строку json: http://json2csharp.com/ , чтобы проверить правильность ваших классов.

10
задан yairchu 15 June 2009 в 18:56
поделиться

2 ответа

Из Интерфейс внешних функций Haskell 98 1.0 ,

Динамический импорт.

Тип динамической заглушки должен быть форма (FunPtr ft) -> ft , где ft может быть любым внешним типом.

В качестве примера рассмотрим

 внешний импорт ccall "динамический" 
 mkFun :: FunPtr (CInt -> IO ()) -> (CInt -> IO ())

Фабрика заглушек mkFun преобразует любой указатель на функцию C, которая получает целочисленное значение в качестве единственного аргумента и не имеет возвращаемого значения, в соответствующую функцию Haskell.

В вашем случае использование будет выглядеть примерно так:

foreign import ccall "dynamic"
  funPktToNil:: FunPtr (Ptr AVPacket -> IO ()) -> Ptr AVPacket -> IO ()

av_free_packet :: Ptr AVPacket -> IO ()
av_free_packet pkt =
  when (nullPtr /= pkt) $ do
    destruct <- (#peek AVPacket, destruct) pkt
    when (nullFunPtr /= destruct) $ funPktToNil destruct pkt
8
ответ дан 3 December 2019 в 22:38
поделиться

Небольшой пример, демонстрирующий, что это (ответ эфемента) действительно работает (следуя озабоченности gbacon):

C:

#include <stdio.h>

typedef void funcType(int, int);
typedef funcType * pFuncType;

void printer(int a, int b) {
  printf("%d %% %d\n", a, b);
}

pFuncType gimmeFunc(int dummy) {
  return printer;
}

Haskell:

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.Ptr

foreign import ccall unsafe "gimmeFunc"
  c_gimmeFunc :: Int -> IO (FunPtr (Int -> Int -> IO ()))
foreign import ccall "dynamic"
  mkFunIntIntNil :: FunPtr (Int -> Int -> IO ()) -> Int -> Int -> IO ()

main :: IO ()
main = do
  fun <- c_gimmeFunc 1
  mkFunIntIntNil fun 3 5

Это работает для меня - печатает 3% 5

7
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: