[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