2012-06-05 5 views
10

Ovviamente la risposta è in qualche modo passare/prendere un blocco contiguo di memoria, quindi la domanda è più su come farlo. Per ora posso ancora evitare il problema scrivendo le funzioni wrapper sul lato C, ma non è una soluzione molto permante.FFI Haskell - Come gestire le funzioni C che accettano o restituiscono le strutture anziché i puntatori alle strutture?

+0

Stai cercando qualcosa come [questo] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –

+0

Giusto per confermare: vuoi passare la struttura per valore, non per riferimento? –

+0

@Don yes, è corretto. – Cubic

risposta

12

L'FFI non supporta il passaggio arbitrario dei tipi memorizzabili Haskell.

si può passare solo i valori di tipo (e alcuni di questi sono puntatori):

Int#, Word#, 
Char#, 
Float#, Double#, 
Addr#, 
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#. 

Quindi, per passare una struttura è necessario avvolgere la chiamata tramite un wrapper C; che prende un puntatore e passa il suo valore alla funzione C che si desidera effettivamente chiamare.

Una recente estensione GHC consente importazioni "primop", che bypassano il meccanismo FFI e supportano convenzioni di chiamata arbitrarie e strutture di passaggio tramite tuple non in scatola. Per esempio.

foreign import prim "ITCHv41_run" 
    parseITCHv41# :: Addr# -> Word# 
       -> (# Int#, Word#, Word#, Word#, Word#, Word# #) 

È possibile utilizzare questi per fare tricky low level stuff come questo.

+3

Grazie per aver collegato quel blog - ha un sacco di cose davvero utili. – Crashworks

Problemi correlati