
Thanks so far, but I'm still having troubles with converting String to
CString.... The error I'm getting is:
Couldn't match type `IO CString' with `Ptr CChar'
Expected type: CString
Actual type: IO CString
code:
-------
import Foreign
import Foreign.C
--int somemethod(char *param, int length, double array[], int UB1, int UB2,
bool isValid);
foreign import stdcall unsafe "setmoduletable" c_setmoduletable ::
CString -> CInt -> Ptr CDouble -> CInt -> CInt -> CInt -> IO CInt
main = do
let param = newCString "someString"
--paramLength = length param
let realTable = [ 0.0111125, 0.0111125, 0.009525] :: [CDouble]
ub1 = 0::CInt
ub2 = 2::CInt
--isValid = False
realTablePtr <- newArray realTable
x <- c_setmoduletable param 14 realTablePtr ub1 ub2 0
free realTablePtr
putStrLn $ "c_setmoduletable output: " ++ show x
putStrLn "Done"
cheers,
m.
On Sat, Sep 21, 2013 at 4:21 PM, Edward Z. Yang
You should use the C variants of all the types, so
type CBool = CInt foreign import stdcall unsafe "setmoduletable" c_setmoduletable :: CString -> CInt -> Ptr CDouble -> CInt -> CInt -> CBool -> IO CInt
Edward
Excerpts from Miro Karpis's message of Sat Sep 21 08:55:58 -0400 2013:
thanks,.. so far I came to this. I can compile it but not getting the right values from the method. Most probably some problem with the pointers...
---------------- --int setmoduletable(char *param, int length, double array[], int UB1, int UB2, bool isValid);
foreign import stdcall unsafe "setmoduletable" c_setmoduletable :: Ptr Char
-> Int
-> Ptr (Double)
-> Int
-> Int
-> Bool
-> IO Int
main = do let param = "someString" let paramLength = length param realTable = [ 0.0111125, 0.0111125, 0.009525] :: [Double] ub1 = 0 ub2 = 2 isValid = False realTablePtr <- newArray realTable paramPtr <- newArray param x <- c_setmoduletable paramPtr paramLength realTablePtr ub1 ub2 isValid free realTablePtr free paramPtr putStrLn $ "c_setmoduletable output: " ++ show x putStrLn "Done"
On Sat, Sep 21, 2013 at 1:06 AM, Brandon Allbery
On Fri, Sep 20, 2013 at 6:53 PM, Miro Karpis < miroslav.karpis@gmail.com>wrote:
Please, I just can not figure this out:
I have a method in my C dll: int somemethod(char *param, int length, double array[], int UB1, int UB2, bool isValid);
I would like to use this method in Haskell, so I have defined it like:
foreign import stdcall unsafe "somemethod" c_somemethod :: Ptr CString
You don't want Ptr CString. See:
Prelude> :m +Foreign.C.String Prelude Foreign.C.String> :i CString type CString = GHC.Ptr.Ptr Foreign.C.Types.CChar -- Defined in `Foreign.C.String'
In other words, CString is an alias for Ptr CChar. Ptr CString corresponds to (char **), not (char *).
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net