有一个在“C” wiringPi库类型的功能,调用由C指针引用该函数与Haskell的FFI C函数
extern void (*pinMode) (int pin, int mode) ;
我试图从Haskell中使用FFI调用它with FunPtr。所以,我没有,
foreign import ccall unsafe "wiringPi.h &pinMode" c_pinMode
:: FunPtr (CInt -> CInt -> IO())
foreign import ccall "dynamic" dc_pinMode
:: FunPtr (CInt -> CInt -> IO()) -> (CInt -> CInt -> IO())
但出于某种原因,即使它编译,它似乎并没有被调用函数“pinMode”点。
所以我尝试使用普通的Foreign.Ptr,认为我可以窥视Ptr以获得对'pinMode'指向的底层'C'函数的引用。所以,我想,
foreign import ccall "wiringPi.h &pinMode" c_pinMode
:: Ptr (Ptr (CInt -> CInt -> IO()))
,然后在调用“pinMode”哈斯克尔功能的实现我曾经偷看两次,以获得底层函数的引用。但是,编译器告诉我,(CInt -> CInt -> IO())
类型的函数不是“Storable”类型类型的实例,所以我不断收到编译错误。
所以我检查了可存储的类型类,使(CInt -> CInt -> IO())
成为可存储类型类的一个实例。需要的最小实现是偷看,戳和其他一些函数。我意识到,它真的不应该那么困难调用一个指针参考的函数..
我觉得我缺少一些基本的东西。有人可以请指点我正确的方向吗?
感谢和问候
'的extern无效(* pinMode)(INT引脚INT模式);''声明pinMode'作为一个_pointer_指向一个带两个“int”并返回“void”的函数。尝试'外国进口ccall不安全“wiringPi.h pinMode”c_pinMode',采取指针的地址给你一个级别的间接太多(但我不太熟悉FFI,所以我不是100%确定我解释它的权利)。 – 2013-03-04 15:06:27
'pinMode'是函数还是函数指针?如果它是一个函数指针,我认为“外部导入ccall不安全”的wiringPi.h和pinMode“c_pinMode”应该是'Ptr(FunPtr(CInt - > CInt - > IO()))''。 – nymk 2013-03-04 16:25:26
@nymk pinMode是一个指向以2个整数为参数的过程的指针。比如说,我将导入的类型改写为你提到的内容。是否仍有可能获得对haskell方面底层函数的引用?因为,如果c_pinMode类型是'Ptr(FunPtr(CInt - > CInt - > IO()))',我不能'c_pinMode(3 :: CInt)(4 :: CInt)'。我不认为这有效。不过,我会尝试你所说的。 – Jay 2013-03-05 02:59:50