allocate memory to Char **

Lamine mohamadoulamine at gmail.com
Tue Apr 29 14:21:18 UTC 2014


Thank a lot ! it works!
Lamine.
On 04/29/2014 03:52 PM, Sylvain Henry wrote:
> To create the [String] as in your example, you just have to write:
>
> let names = ["x"++ show i | i <- [0..w-1]]
> varnames <- mallocList names
>
> -Sylvain
>
>
> 2014-04-29 15:40 GMT+02:00 Lamine <mohamadoulamine at gmail.com 
> <mailto:mohamadoulamine at gmail.com>>:
>
>     Hi Sylvain,
>     thank you for your response! I try to use  this 2 lines
>
>     allocaArray (w*n) $ \var -> do
>                       xs <- peekArray (w) var
>     to code
>     char **varnames = ccl_new_array (char *, w);
>
>     but it return [CString] not a [String]
>
>     On 04/29/2014 01:58 PM, Sylvain Henry wrote:
>>     Hi,
>>
>>     "varnames" is an array of pointers, you cannot allocate it with
>>     mallocBytes (n*100).
>>
>>     Try something like this (not tested):
>>
>>     mallocList :: [String] -> IO (Ptr CString)
>>     mallocList xs = newArray =<< forM xs g
>>       where
>>         g x = do
>>            b <- mallocBytes 100
>>            pokeCString b x 99
>>            return b
>>
>>     pokeCString :: CString -> String -> Int -> IO ()
>>     pokeCString dst value maxLen = withCStringLen (take maxLen value)
>>     $ uncurry (copyArray dst)
>>
>>     -Sylvain
>>
>>
>>     2014-04-29 13:11 GMT+02:00 Lamine <mohamadoulamine at gmail.com
>>     <mailto:mohamadoulamine at gmail.com>>:
>>
>>
>>         Hi,
>>
>>         I want to do write this C code in haskell code, but i have
>>         some pb:
>>
>>         int w ;
>>         char **varnames = ccl_new_array (char *, w);
>>
>>         int i;
>>                   for (i = 0; i < w; i++)
>>                     {
>>                       varnames[i] = ccl_new_array (char, 100);
>>                       sprintf (varnames[i], "x%d", i);
>>                     }
>>
>>         I try this code unsing mallocList to
>>         (http://lpaste.net/report/712):
>>         mallocList :: [CString] -> IO (Ptr CString)
>>         mallocList xs = do let n = Prelude.length xs
>>                            p <- mallocBytes (n*100)
>>                            forM_ (Prelude.zip [0..] xs)
>>                             (uncurry (pokeByteOff p))
>>                            return p
>>
>>         let n = sizeOf(undefined :: CString)
>>                    allocaArray w $ \var -> do
>>                           xs <- peekArray (w*n) var
>>                           varnames <- mallocList xs
>>
>>         I have an error "segmentation fault(core dumped)".
>>         can someone please help me? Thank you.
>>
>>         Lamine
>>         _______________________________________________
>>         FFI mailing list
>>         FFI at haskell.org <mailto:FFI at haskell.org>
>>         http://www.haskell.org/mailman/listinfo/ffi
>>
>>
>
>
>     -- 
>     « Chaque génération doit, dans un état relatif de captivité,
>     découvrir sa mission. Elle a le choix de la remplir ou la trahir».
>     Frantz Fanon
>
>


-- 
« Chaque génération doit, dans un état relatif de captivité, découvrir 
sa mission. Elle a le choix de la remplir ou la trahir». Frantz Fanon
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ffi/attachments/20140429/32288bea/attachment-0001.html>


More information about the FFI mailing list