<div><div>You do realize that the example you gave is just as general as all the tutorials.<br><br>Here is an example I was working, but it gives a <strong>segmentation fault</strong> for some reason:<br><br>example.h<br><br>
typedef struct<br>{<br>        unsigned char a;<br>        unsigned char b;<br>        unsigned char c;<br>        unsigned char d;<br>} IP;<br><br>IP* shiftIP(IP* addr);<br><br><br>example.c<br><br>#include &quot;example.h&quot;<br><br>IP* shiftIP(IP* addr){
<br>        unsigned char t;<br>        t = addr-&gt;a;<br>        addr-&gt;a = addr-&gt;b;<br>        addr-&gt;b = addr-&gt;c;<br>        addr-&gt;c = addr-&gt;d;<br>        addr-&gt;d = t;<br>}<br><br></div></div>Example.hsc<br><br>{-# OPTIONS -ffi -fglasgow-exts #-}
<br>module Example where<br><br>import Foreign<br>import Foreign.C.Types<br>import Control.Monad<br><br>#include &quot;buzz.h&quot;<br><br>data MyIP = MyIP <br>    { a :: CUChar<br>    , b :: CUChar<br>    , c :: CUChar<br>
    , d :: CUChar<br>    } deriving (Show)<br><br>instance Storable MyIP where<br>    sizeOf    _ = #{size IP} -- 4<br>    alignment _ = alignment (undefined :: CUChar) -- 1<br>    peek p = return MyIP<br>        &nbsp;&nbsp;`ap` (#{peek IP, a} p)
<br>        &nbsp;&nbsp;`ap` (#{peek IP, b} p)<br>        &nbsp;&nbsp;`ap` (#{peek IP, c} p)<br>        &nbsp;&nbsp;`ap` (#{peek IP, d} p)<br>    poke p ip = do<br>        &nbsp;&nbsp;#{poke IP, a} p $ a ip<br>        &nbsp;&nbsp;#{poke IP, b} p $ b ip<br>        &nbsp;&nbsp;#{poke IP, c} p $ c ip
<br>        &nbsp;&nbsp;#{poke IP, d} p $ d ip<br><br>foreign import ccall safe   &quot;static buzzlib.h shiftIP&quot; <br>    shiftIP :: Ptr MyIP -&gt; Ptr MyIP<br><br>shiftMyIP :: MyIP -&gt; MyIP<br>shiftMyIP ip = unsafePerformIO . alloca $ \ptr -&gt; poke ptr ip &gt;&gt; peek (shiftIP ptr)
<br><br><br>