[Haskell-beginners] help with FFI: passing char* to dll function + pointer freeing
Miro Karpis
miroslav.karpis at gmail.com
Sat Sep 21 23:40:27 CEST 2013
yes, that solved it. millions of thanks everybody ;-)
m.
On Sat, Sep 21, 2013 at 10:10 PM, Edward Z. Yang <ezyang at mit.edu> wrote:
> Hello Miro,
>
> The immediate problem is that you need to use the bind
> notation (param <- newCString "foo") rather than let
> notation, but if the string will not be used beyond the
> function call, it is preferable to use withCString
>
> Edward
>
> Excerpts from Miro Karpis's message of Sat Sep 21 15:25:58 -0400 2013:
> > 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 <ezyang at mit.edu> wrote:
> >
> > > 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 <
> 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
> > > > >
> > >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130921/07dabebd/attachment.htm>
More information about the Beginners
mailing list