gpt4 book ai didi

c - 将 C 函数导入 Haskell 时遇到问题

转载 作者:行者123 更新时间:2023-12-02 22:27:12 26 4
gpt4 key购买 nike

我有一个调用 Haskell 函数的 C 程序。我希望 Haskell 函数负责确定数组(指针)的大小,因此我还希望 Haskell 从 C 中 malloc 指针。在 Haskell 中调用 malloc_ 时出现错误。我不确定如何将 C malloc_((void *)&ints,sizeof(int),10); 中调用 malloc_ 的方式模拟到 Haskell 中。

aux.c

void malloc_ (void **p, size_t size, int m) {
*p = malloc(size*m);
}

main.c

int *ints;
// want to call this function in Haskell, C doesn't know how large the array is
// malloc_((void *)&ints,sizeof(int),10);

int ints_size = setIntArray(ints);

for (int i = 0; i < ints_size; i++) {
printf("ints[%d]: %d\n", i, ints[i]);
}

数组.hs

#include "aux.h"
-- this might be wrong
foreign import ccall "malloc_" malloc_ :: Ptr (Ptr ()) -> CSize -> CInt -> IO ()

foreign export ccall "setIntArray" setIntArray :: Ptr CInt -> IO CInt
setIntArray :: Ptr CInt -> IO (CInt)
setIntArray is = do
let r = 10 :: Int

-- if I remove this and malloc in C then it is fine
malloc_ (castPtr is) (fromIntegral $ sizeOf is) (fromIntegral r)


x <- addArrayElement r 0

return $ fromIntegral x

where
addArrayElement :: Int -> Int -> IO Int
addArrayElement r pointerCounter =
case pointerCounter >= r of
True -> return r
False -> do
let x = 1234
poke (advancePtr is pointerCounter) (x :: CInt)
addArrayElement r (pointerCounter + 1)

最佳答案

忽略您的问题中的其他问题,只解决有关调用 malloc 的部分:您有几个选择。

  • malloc 已为您导入为 malloc ,或者您甚至可以使用 mallocArray在这种情况下。

  • 如果您确实想自己导入 malloc (也许您实际上想使用不同的分配器),您可以通过从您的应用程序返回指针值来使事情变得更方便。包装器,就像 malloc 本身一样:

    void *malloc_ (size_t size, int m) {
    return malloc(size*m);
    }

    然后foreign import ccall "malloc_"malloc_::CSize -> CInt -> IO (Ptr()),调用即可。

  • 如果您确实想使用这种外参数样式 void malloc_ (void **p, size_t size, int m),那么您必须为 分配存储空间>void *,这样您就可以将其地址作为 malloc_ 的第一个参数传递,就像在 C 中所做的那样。

      my_allocated_pointer <- with nullPtr $ \pp -> do
    malloc_ pp (fromIntegral $ sizeOf (undefined :: CInt)) (fromIntegral 10)
    peek pp

    (现在开始变得有点愚蠢,因为 with 在内部使用 malloc...但这是您通常会使用的方法。)

关于c - 将 C 函数导入 Haskell 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com