Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1.  FFI and opac struct (PICCA Frederic-Emmanuel)
   2. Re:  FFI and opac struct (PICCA Frederic-Emmanuel)


----------------------------------------------------------------------

Message: 1
Date: Sun, 24 Jan 2016 09:15:26 +0000
From: PICCA Frederic-Emmanuel
        <frederic-emmanuel.pi...@synchrotron-soleil.fr>
To: "beginners@haskell.org" <beginners@haskell.org>
Subject: [Haskell-beginners] FFI and opac struct
Message-ID:
        
<a2a20ec3b8560d408356cac2fc148e53b301e...@sun-dag3.synchrotron-soleil.fr>
        
Content-Type: text/plain; charset="us-ascii"

Hello

Here the code I try to use

I get an array of (HklFactory *) via the GetAll method and I want to read for 
each of these HklFactory the name of the factory with the NameGet method.


-- data HklFactory
newtype HklFactory = HklFactory (Ptr HklFactory) deriving (Show, Storable)

hklFactoryGetAll :: IO [HklFactory]
hklFactoryGetAll = alloca $ \ptr -> do
                 factories <- c_hkl_factory_get_all ptr
                 n <- peek ptr
                 peekArray n factories

foreign import ccall unsafe "hkl.h hkl_factory_get_all"
  c_hkl_factory_get_all :: Ptr Int
                                     -> IO (Ptr HklFactory)

hklFactoryNameGet :: Ptr HklFactory
                                -> IO String
hklFactoryNameGet factory = do
  name <- c_hkl_factory_name_get factory
  peekCString name

foreign import ccall unsafe "hkl.h hkl_factory_name_get"
  c_hkl_factory_name_get :: Ptr HklFactory
                                           -> IO CString

main :: IO ()
main = do
    initGUI

    factories <- hklFactoryGetAll
    names <- mapM hklFactoryNameGet factories
    print factories
    print names


the signature of the C method are:

typedef struct _HklFactory HklFactory;

HKLAPI HklFactory **hkl_factory_get_all(size_t *n) HKL_ARG_NONNULL(1);

HKLAPI const char *hkl_factory_name_get(const HklFactory *self) 
HKL_ARG_NONNULL(1);


when I run the haskell code, I just get garbage when I try to extract the name 
of all HklFActoies

here the output

[HklFactory 0xb777b920,HklFactory 0xb777ba6c,HklFactory 0xb777ba98,HklFactory 
0xb777bac4,HklFactory 0xb777bbf8,HklFactory 0xb777bef8,HklFactory 
0xb777c4f0,HklFactory 0xb777c524,HklFactory 0xb777c6c0,HklFactory 
0xb777c784,HklFactory 0xb777c8a8,HklFactory 0xb777c8dc,HklFactory 
0xb777c908,HklFactory 0xb777c9cc]
[",v+v<w\STX","2v,vw\EOT","2v|.vw\EOT","2v\DC40vw\EOT","5v\\3v\DC4w\EOT","_8v86v\DC4w\ACK","z@v9v\fw\ACK","@v\EOT<v@w\ACK","EvBvw\ACK","GvEvw\ENQ","yNvGvw\ACK","NvHJvw\EOT","Nv,Lv$w\ENQ","PvNvw\EOT"]

Instead of human readable names I get this garbage.

So I do not understand what is going on and what is wrong in my haskell code.

thanks for your help


Frederic



------------------------------

Message: 2
Date: Sun, 24 Jan 2016 10:18:34 +0000
From: PICCA Frederic-Emmanuel
        <frederic-emmanuel.pi...@synchrotron-soleil.fr>
To: "The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell" <beginners@haskell.org>
Subject: Re: [Haskell-beginners] FFI and opac struct
Message-ID:
        
<a2a20ec3b8560d408356cac2fc148e53b301e...@sun-dag3.synchrotron-soleil.fr>
        
Content-Type: text/plain; charset="us-ascii"

I found the error

[HklFactory 0xb7772920,HklFactory 0xb7772a6c,HklFactory 0xb7772a98,HklFactory 
0xb7772ac4,HklFactory 0xb7772bf8,HklFactory 0xb7772ef8,HklFactory 
0xb77734f0,HklFactory 0xb7773524,HklFactory 0xb77736c0,HklFactory 
0xb7773784,HklFactory 0xb77738a8,HklFactory 0xb77738dc,HklFactory 
0xb7773908,HklFactory 0xb77739cc]
["TwoC","E4CH","SOLEIL MARS","E4CV","K4CV","E6C","SOLEIL SIRIUS 
KAPPA","K6C","PETRA3 P09 EH2","SOLEIL SIRIUS TURRET","SOLEIL SIXS 
MED2+3","SOLEIL SIXS MED1+2","SOLEIL SIXS MED2+2","ZAXIS"]

the signature of the C methode was wrong

Ptr HklFactory -> HklFactory

foreign import ccall unsafe "hkl.h hkl_factory_name_get"
  c_hkl_factory_name_get :: HklFactory
                         -> IO CString

thanks for your help ;)


------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 91, Issue 28
*****************************************

Reply via email to