問題タブ [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.

0 投票する
1 に答える
138 参照

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次の警告で指摘されているように、ハードコーディングされたアライメントとオフセットを使用することは悪い習慣です。それらは壊れやすく、プラットフォーム/コンパイラに依存します。代わりに、c2hscc2hs またはbindings-dslgreencardなどのツールを使用する必要があります。

0 投票する
1 に答える
123 参照

haskell - Data.ByteString.Lazy を CStringLen に変換する最も効率的な方法

一部のデータを JSON にエンコードし、hsyslog を使用して syslog にプッシュする必要があります。関連する 2 つの関数のタイプは次のとおりです。

を変換する最も効率的な方法 (速度とメモリ) はLazy.ByteString -> CStringLen何ですか? を見つけましたが、 ではなく?Data.ByteString.Unsafeでのみ機能します。ByteStringLazy.ByteString

私はただ固執してunsafeUseAsCStringLen . Data.String.Conv.toS、それを一日と呼びましょうか?それは効率に関して正しいことになるでしょうか?