Manuel Would it be worth mentioning or amplifying this point in the FFI spec, or perhaps in an accompanying Appendix/Commentary of examples and FAQs? Else someone else is going to trip over it sooner rather than later.
Simon | -----Original Message----- | From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Glynn | Clements | Sent: 04 June 2003 08:32 | To: Matthew Donadio | Cc: [EMAIL PROTECTED] | Subject: Re: FFI Help | | | Matthew Donadio wrote: | | > I am just starting to experiment with FFI, and am running into a | > problem. I was to create an FFI to the lgamma(3) found in many of the | > newer libm implementations. My code follows the sig. | > | > The lgamma function works. The gamma function core dumps (I am using | > ghc 5.04.3) on me. gdb reports a SIGSEGV in signgam(), but I'm not sure | > why. I believe that I need to use the monad because signgam is only | > valid after lgamma returns. | > | > Does anyone have an idea what I am doing wrong? | > | > Thanks. | > | > -- | > Matthew Donadio <[EMAIL PROTECTED]> | > | > > module Gamma (gamma, lgamma) where | > | > > import System.IO.Unsafe | > | > > foreign import ccall "math.h lgamma" lgammaC :: Double -> IO Double | > > foreign import ccall "math.h signgam" signgamC :: IO Int | | signgam is an "int" variable, but this assumes that it is a function | of type "int signgam(void)". | | Write a C wrapper "int get_signgam(void) { return signgam; }" and | import that. | | -- | Glynn Clements <[EMAIL PROTECTED]> | Or alternatively, foreign import the address of the int and read it | directly with 'peek'. | | import Foreign | ... | foreign import ccall "math.h &signgam" signgamC :: Ptr Int32 | ... | gammaIO :: Double -> IO Double | gammaIO x = do lg <- lgammaC x | s <- peek signgamC | return $ fromIntegral s * exp lg | | | Regards, | Malcolm _______________________________________________ FFI mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/ffi