Natürlich ist die Antwort, irgendwie einen zusammenhängenden Speicherblock zu übergeben/aufzunehmen, also ist die Frage mehr, wie man das macht. Für den Moment könnte ich das Problem noch vermeiden, indem ich Wrapper-Funktionen auf der C-Seite schreibe, aber das ist keine große Dauerlösung.Haskell FFI - Wie mit C-Funktionen, die akzeptieren oder zurückgeben Strukturen anstelle von Zeigern auf Strukturen?
Antwort
Das FFI unterstützt keine beliebigen Haskell-Typen, die nach Wert übergeben werden können.
Sie können nur Werte vom Typ passieren (und einige davon sind Zeiger):
Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.
, also eine Struktur zu übergeben Sie den Anruf über einen C-Wrapper wickeln müssen; Das nimmt einen Zeiger und übergibt seinen Wert an die C-Funktion, die Sie tatsächlich aufrufen möchten.
Eine aktuelle GHC-Erweiterung ermöglicht "primop" -Importe - die den FFI-Mechanismus umgehen und willkürliche Aufrufkonventionen und das Übergeben von Strukturen über ungepackte Tupel unterstützen. Z.B.
foreign import prim "ITCHv41_run"
parseITCHv41# :: Addr# -> Word#
-> (# Int#, Word#, Word#, Word#, Word#, Word# #)
Sie können diese verwenden, tricky low level stuff so zu tun.
Danke für die Verknüpfung dieses Blogs - es hat eine Menge wirklich nützlicher Sachen. – Crashworks
- 1. Wie verwende ich Haskells FFI auf Strukturen?
- 2. Strukturen mit Zeigern falsch erhalten
- 3. Statische Array von Strukturen mit Zeigern
- 4. Korrekte Verwendung von Zeigern mit Strukturen
- 5. Konvertieren von LuaJIT-FFI-Strukturen in Tabellen
- 6. Wie kann ich ein Array von Zeigern auf Strukturen initialisieren?
- 7. Haskell und veränderbare Strukturen 'Leistung
- 8. Löschen eines Elements aus einem Array von Zeigern auf Strukturen
- 9. Übergabe von Zeigern an private Strukturen in C?
- 10. Zugriff auf ein Array von Strukturen in anderen Strukturen?
- 11. c Zeiger auf Array von Strukturen
- 12. P/Invoke Zurückgeben Array von Strukturen mit String-Feldern
- 13. C: Einfügen Sortierlogik funktioniert nicht mit Zeigern und Strukturen
- 14. C Array von Strukturen von Array von Strukturen
- 15. Verschachteln von Strukturen mit Datomic
- 16. Vergleichen von zwei Strukturen mit ==
- 17. Berechnung mit Array von Strukturen?
- 18. Array von Strukturen - Struktur?
- 19. Verwenden von MEMSET auf Strukturen in C++
- 20. Wie marshaliere ich einen Zeiger auf ein Array von Zeigern auf Strukturen?
- 21. SWIG Verlust von Strukturen
- 22. Atomspeicher. Strukturen
- 23. initialisieren Strukturen dynamisch
- 24. Serialisierung von Strukturen
- 25. Marshall Array von Strukturen
- 26. C: Vec von Strukturen
- 27. Wie Schleife für Strukturen?
- 28. Wie man Zeiger auf im Vektor gespeicherte Strukturen behält?
- 29. generieren Go-Strukturen von XSD
- 30. Schnelle Serialisierung/Deserialisierung von Strukturen
Suchen Sie etwas wie [dies] (http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs). –
Nur zur Bestätigung: Sie wollen die Struktur nach Wert übergeben, nicht Referenz? –
@Don ja, das ist richtig. – Cubic