Yes, the hs_add_root call is essential. You can see what ghc does when compiling .c files by running it with -v; the main difference is that we pass some extra -I options so that you can access header files that come with GHC.
Cheers, Simon On 08 June 2005 19:09, Yann Morvan wrote: > The problem disapears when I use GHC to compile the c file, this > somehow allows the linker to find the __stginit_SortPoints3() > function. > I don't really understand what GHC does differently from gcc at > compile time on c files. > Thank you for your time. > > Yann Morvan > > Yann Morvan wrote: > >> Hello, >> I am calling a Haskell function from C using foreign export, it >> works fine on the first call, but as soon as I call it again I get: >> >> internal error: stg_ap_pp_ret >> >> and I am asked to report it as a bug. >> I don't know how much detail I should give, so I'll just reproduce >> the relevant code (excuse the clumsyness): >> On the Haskell side: >> >> module SortPoints3 where >> [...] >> data Vect2D = Vect2D {xx,yy :: CFloat} deriving Show >> >> instance Storable Vect2D where >> peek a = do >> x <- peekElemOff (castPtr a) 0 >> y <- peekElemOff (castPtr a) 1 >> return (Vect2D x y) >> poke a (Vect2D x y) = do >> pokeElemOff (castPtr a) 0 x >> pokeElemOff (castPtr a) 1 y >> sizeOf a = let dummy = Vect2D 2.0 2.0 in >> (sizeOf (xx dummy) + (sizeOf (yy dummy))) >> alignment a = 4 >> [...] >> foreign export ccall doIt :: (Ptr Vect2D) -> (Ptr Vect2D) -> CInt -> >> CFloat -> IO () >> >> doIt :: (Ptr Vect2D) -> (Ptr Vect2D) -> CInt -> CFloat -> IO () >> doIt pointsPtr projectedPtr n t = do >> points <- peekArray (fromIntegral n) pointsPtr >> (sortedPoints, sortedProjections ) <- sortPoints t points >> pokeArray pointsPtr sortedPoints >> pokeArray projectedPtr sortedProjections >> return () >> >> On the C side, the function is called from a callback function of >> the OpenCV library. I pass it pointers to the OpenCV CvPoint2D32f >> type, which is a simple struct with two floats for coordinates. >> >> I had to remove the call to hs_add_root as the linker (GHC's) >> couldn't find __stginit_SortPoints3() >> >> I tried the following: >> >> foreign export ccall printIt :: CFloat -> IO () >> >> printIt :: CFloat -> IO () >> printIt f = putStr $ "\nTest\n" ++ (show f) ++ "\n" >> >> this function has no problem when called several times from the same >> location in the c code. >> >> Please tell me what to fix if the error is on my side. >> Thank you for your time, >> >> Yann Morvan >> >> > > _______________________________________________ > Glasgow-haskell-bugs mailing list > Glasgow-haskell-bugs@haskell.org > http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs _______________________________________________ Glasgow-haskell-bugs mailing list Glasgow-haskell-bugs@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs