問題タブ [haskell-ffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Haskell FFI: 個別に割り当てられた文字列 (char*) を含む C 構造体をラップする
C構造体があるとします
f
そして、それに対して何らかの操作を行う関数、
C API は、char*
を呼び出す前に十分なバッファーを割り当てることを要求しf
ます。
(num
この構築された例では、フィールドには目的がないことに注意してください。これは、 and を使用した簡単な解決策を妨げるだけCString
ですCStringLen
。)
問題は、この種の C API 用の Haskell FFI をどのように作成するかです。
私が思いついたのはこれです:
Storable インスタンスを作成します。私の考えは、文字列のバッファとして機能する最後に 64 バイトを割り当てることです。
poke
割り当てられたバッファを指すように str のポインタを変更する必要があり、Haskell 文字列をそこにコピーする必要があります。私はこれを行いwithCStringLen
ます:
最後にpeek
、簡単な を次に示します。
これはすべて機能しますが、かなり醜いと思います。これはそれを行う方法ですか、それともより良い方法はありますか?
誰かがそれで遊びたい場合、小さなおもちゃの問題はgithubにあります。
アップデート
chi
次の警告で指摘されているように、ハードコーディングされたアライメントとオフセットを使用することは悪い習慣です。それらは壊れやすく、プラットフォーム/コンパイラに依存します。代わりに、c2hsc、c2hs またはbindings-dsl、greencardなどのツールを使用する必要があります。
haskell - Data.ByteString.Lazy を CStringLen に変換する最も効率的な方法
一部のデータを JSON にエンコードし、hsyslog を使用して syslog にプッシュする必要があります。関連する 2 つの関数のタイプは次のとおりです。
を変換する最も効率的な方法 (速度とメモリ) はLazy.ByteString -> CStringLen
何ですか? を見つけましたが、 ではなく?Data.ByteString.Unsafe
でのみ機能します。ByteString
Lazy.ByteString
私はただ固執してunsafeUseAsCStringLen . Data.String.Conv.toS
、それを一日と呼びましょうか?それは効率に関して正しいことになるでしょうか?