Marshall Multidimensional list, multidimensional array Part II

David Lo davidlo.mail at gmail.com
Wed Nov 10 05:32:37 EST 2004


Dear all,

  I try to use the following to convert [[Int]] to C's int[][] :

foreign export stdcall doCompForeign :: CString -> CString -> IO (Ptr (Ptr Int))


doCompForeign :: CString -> CString -> IO (Ptr (Ptr Int))
doCompForeign patraw cnameraw = 	let 	pat = peekCString patraw 
      						cname = peekCString cnameraw
      					in doCompHelp pat cname 
     

doCompHelp :: IO String-> IO String -> IO (Ptr (Ptr Int))
doCompHelp patIO cnameIO = do 	pat <- patIO
				cname <- cnameIO
				if pat Prelude.== "hns" then (doComp hns cname)
      					else if pat Prelude.== "up" then (doComp up cname)
      					else if pat Prelude.== "down" then (doComp down cname)
					else if pat Prelude.== "hill" then (doComp hill cname)
      					else (doComp hs cname)

doComp :: Pattern -> String ->  IO (Ptr (Ptr Int))
doComp pat cname
 = do (tiPrim,b) <- loadTi cname
      t1 <- getCPUTime             
      let insts = runVMC (solve (1,b) pat) tiPrim 
      newArray (toArray insts)

toArray :: [[Int]] ->  [(Ptr Int)]
toArray lst = 	toResultant
		where toResultant = [toArrayRec (lst!!1)] Prelude.++ toArray (tail lst)
		 
toArrayRec :: [Int] -> Ptr Int
toArrayRec lst = unsafePerformIO (newArray lst)

However, it can compile without problem, however I receive the
following error when I run it from C code :

Heap exhausted;
Current maximum heap size is 268435456 bytes (256 Mb);
use `+RTS -M<size>' to increase it.

What have I done wrong ? Some help please.

Thank you in advance for your help and attention.

Best Regards,

David Lo


More information about the Glasgow-haskell-users mailing list