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@gmail.com> wrote:
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