Haskell FFI:返回三个整数和整数x27;他在书堆上

Haskell FFI:返回三个整数和整数x27;他在书堆上,haskell,ghc,ffi,Haskell,Ghc,Ffi,有没有办法从外部函数调用返回堆栈上的三个Int 35;?下面是C代码(或生成与我实际感兴趣的文件等效的对象文件的C代码): 由于ccall不支持(#Int#,Int#,Int#,Int##)),因此无法编译此文件: foreign import ccall "extendedGcd" extendedGcd :: Int# -> Int# -> (# Int#, Int#, Int# #) 我对以下各项的所有使用(尽管使用了MagicHash,ghcforeignmportpr

有没有办法从外部函数调用返回堆栈上的三个
Int 35;
?下面是C代码(或生成与我实际感兴趣的文件等效的对象文件的C代码):

由于
ccall
不支持
(#Int#,Int#,Int#,Int##))
,因此无法编译此文件:

foreign import ccall "extendedGcd"
  extendedGcd :: Int# -> Int# -> (# Int#, Int#, Int# #)
我对以下各项的所有使用(尽管使用了
MagicHash
ghcforeignmportprim
ForeignFunctionInterface
未执行的耦合
,以及
MagicHash
)seg故障:

foreign import prim "extendedGcd"
  extendedGcd :: Int# -> Int# -> (# Int#, Int#, Int# #)
我可以找到一些证据,证明有人试图绕过这类问题:

  • (由同一人提出)

我想这是一个常见的问题,但我找不到任何有效的例子。这有可能吗?如果没有人再关心这个问题了(在什么地方有Trac票证吗?

如果您可以直接在汇编中而不是在C中实现您的过程,那么这样做非常容易。请参阅:。也许对于GCD算法来说,这对你来说是可以的


我准备了一个完整的阴谋集团项目。

您要导入的C函数是什么类型的?我认为它在C中的类型完全决定了您可以在Haskell中为它指定什么类型
ccall
旨在模拟C调用约定;因为C本身没有多重返回的概念,所以它在
ccall
中也不存在。我认为自动结构编组的建议是为了使用
c2hs
或类似的方法自动生成代码来编组结构。@user2407038确定它有一个C类型(我包含了一些代码),但是
Storable
实例
c2hs
生成的所有代码都假设我传递了一个指针。这里,我想传递一个未绑定的产品(堆栈上只有三个原始整数)。我的理解是,在Haskell中实现这一点的唯一方法是通过非固定元组。事实上,如果不在某个地方分配临时内存,从C函数返回结构是不容易的。如果这对性能造成太大的损失(或其他障碍),那么唯一的选择就是使用
prim
并返回一个未绑定的元组。但是,如果您的函数是常规C函数,那么它将不符合要求使用
prim
函数的GHC调用约定。您必须在函数周围编写一个C--包装器。@user2407038我希望看到一个这样的例子@user2407038是的-第二个我已经读了好几遍了。有一个恼人的警告:“许多消息不适合这里提供的5个空闲寄存器(R2-R6),需要部分加载到堆栈中。在本例中,我只是放弃“可打印”标志以使所有内容都适合寄存器。管理堆栈更为复杂”哦,这实际上不适用于GCD。这用于生成具有Rust元组的Haskell互操作。:)这仍然是有用的!非常感谢。
foreign import prim "extendedGcd"
  extendedGcd :: Int# -> Int# -> (# Int#, Int#, Int# #)