gpt4 book ai didi

c - 将 Haskell 中数组的指针传递给 C 函数

转载 作者:行者123 更新时间:2023-12-03 04:11:33 25 4
gpt4 key购买 nike

我有以下 C 代码:

#include <sys/times.h>
#include <time.h>


float etime_( float *tarray )
{ struct tms buf;

times( &buf );

tarray[0] = 1.0 * buf.tms_utime / CLOCKS_PER_SEC;
tarray[1] = 1.0 * buf.tms_stime / CLOCKS_PER_SEC;

return tarray[0] + tarray[1];
}

尝试将此 Fortran 代码移植到 Haskell:

  PROGRAM Test
IMPLICIT NONE

REAL t, ta(2), etime

INTEGER i
DOUBLE PRECISION x

do i = 1, 10000
x = sin( cos( i * 1.0 d0 ) )
print *, x
enddo

ta(1) = 0.0d0
ta(2) = 0.0d0

t = etime( ta )

PRINT *, 'user time: ', ta(1)
PRINT *, 'system time: ', ta(2)
PRINT *, 'process time: ', t

END

如何定义数组和!或者 !!!下面的代码可以工作吗?

module Main where

import GHC.Ptr
import GHC.Prim
import System.IO.Unsafe
import Control.Monad

foreign import ccall etime_ :: Ptr Double → IO Double
etime = etime_

main :: IO Int
main = do
mapM_ (print . sin . cos . (* (1.0 :: Double)) . fromIntegral) [1..10000 :: Int]
ta ← array 2
t ← etime ta
putStrLn $ "user time: " ++ show (ta !!! 0)
putStrLn $ "system time: " ++ show (ta !!! 1)
putStrLn $ "process time: " ++ show t
return 0

array :: Int → IO (Ptr a)
array size = undefined

(!) :: Ptr a → Int → IO a
(!) = undefined

(!!!) :: Ptr a → Int → a
(!!!) = undefined

最佳答案

我建议这样做:

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.Marshal.Array (allocaArray, peekArray)
import Foreign.Ptr (Ptr)

foreign import ccall etime_ :: Ptr Float -> IO Float

main :: IO ()
main = do
mapM_ (print . sin . cos . (* (1.0 :: Double)) . fromIntegral) [1..10000 :: Int]
allocaArray 2 $ \ta -> do
ptime <- etime_ ta
[utime, stime] <- peekArray 2 ta
putStrLn $ "user time: " ++ show utime
putStrLn $ "system time: " ++ show stime
putStrLn $ "process time: " ++ show ptime

但要回答您的具体问题:

array :: Storable a => Int -> IO (Ptr a)
array = mallocArray

(!) :: Storable a => Ptr a -> Int -> IO a
(!) = peekElemOff

(!!!) :: Storable a => Ptr a -> Int -> a
(!!!) ptr = unsafePerformIO . peekElemOff ptr

我建议使用hoogle来查找您需要的功能。

关于c - 将 Haskell 中数组的指针传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/995716/

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