[Haskell-beginners] help with FFI: passing char* to dll function + pointer freeing
Edward Z. Yang
ezyang at MIT.EDU
Sat Sep 21 16:21:03 CEST 2013
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 = "Input_Bit_Nozz"
> 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 <allbery.b at gmail.com>wrote:
>
> > On Fri, Sep 20, 2013 at 6:53 PM, Miro Karpis <miroslav.karpis at 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 at gmail.com
> > ballbery at sinenomine.net
> > unix, openafs, kerberos, infrastructure, xmonad
> > http://sinenomine.net
> >
More information about the Beginners
mailing list