問題タブ [c2hs]
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.
haskell - Windowsでのc2hsの使用
私はWindowsでlibxml-enumeratorパッケージを使用しようとしていますが、これは(最終的には)c2hsを使用する必要があります。関連するパッケージをビルドしようとすると、c2hsから一見悪名高い「存在しない」エラーが発生します。これはGCCがインストールされていないことに関連しているようですが、Haskellのgcc.exeのコピーをパスに追加したため、これは奇妙なリストのようです。
誰かがこのバグを打ち負かす方法を知っていますか?
haskell - hsc2hs と c2hs の違いは?
hsc2hs と c2hs の違いは何ですか?
hsc2hs がプリプロセッサであることは知っていますが、正確には何をするのでしょうか?
また、c2hs は C コードから Haskell モジュールを作成できますが、これには hsc2hs が必要ですか?
haskell - c2hsが正しくインストール/登録されていない
を実行するcabal install c2hs
と、正しく終了しているように見えますが、パッケージが登録されていません。パッケージはインストールされていないように見えます。に表示されずghc-pkg list
、再cabal install c2hs
実行は「要求されたすべてのパッケージがすでにインストールされています」と言う代わりに、同じインストール手順を実行します。
これを立ち上げて実行するのに助けていただければ幸いです。ビルド済みのGHC7.4.1バイナリを使用しています。
- カバールインストール出力:http://pastebin.com/CRUii8mm
- インポートは無効です:http://pastebin.com/r0aypxRA
前もって感謝します!
haskell - C2HS マーシャリング関数にアクセスする最新の方法は何ですか?
cFromEnum
関数を使用したいのですがC2HS
、これはモジュールにあり、不要であり、アンパック/インストールしないでください( c2hs が正しくインストール/登録されていません)。列挙型を変換する最新の方法は何ですか? 具体的には、これが私のコードです。
(get_nodes_by_type
最終的には引数を取ります。私は今のところ何かを機能させようとしています)。
haskell - c2hs-匿名の列挙型?
c2hsリファレンス(別名「チュートリアル」)は、オプションではないパラメーターとしてC列挙型の名前に言及しています。匿名の列挙型で動作させる方法はありますか?生成する列挙型の決定は、単一の列挙型メンバーがあれば可能である必要があります。それが不可能な場合でも、少なくともそのメンバーに明示的に名前を付けることで列挙型を生成できるはずです。
明確にするために:
列挙型が与えられた
の線に沿って何かが欲しいのですが
haskell - 「外部」ポインターを使用して C2HS を動作させることができません
一般情報
私は現在、C->Haskell (C2HS) Interface Generator for Haskell を試しています。一見しただけで、それは素晴らしかったです。かなり複雑な C++ ライブラリを (小さなextern C
-wrapper を使用して) わずか 2 時間でインターフェイスしました。(そして、私は以前にFFIをしたことがありません。)
1 つだけ問題がありました。C/C++ ライブラリに割り当てられたメモリを解放するにはどうすればよいでしょうか。私{#pointer ... foreign #}
はC2HSのドキュメントで見つけましたが、それは私が求めているものとまったく同じように見えます. 私の C-wrapper は C++ ライブラリを機能的なインターフェースを備えた参照透過性を備えたライブラリに変換するので、Haskell Storage Manager は私のために大変な作業を行うことができるはずです :-)。残念ながら、私はこれを機能させることができませんでした。私の問題をよりよく説明するために、C/C++ ライブラリ + ラッパーと同じプロパティを持つがオーバーヘッドのない小さなデモ プロジェクトを GitHubにセットアップしました。ご覧のとおり、このライブラリはpure unsafe
FFI で使用しても完全に安全です。
デモプロジェクト
GitHub で、次のような構成の小さなデモ プロジェクトを作成しました。
C ライブラリ
C ライブラリは非常に単純で役に立ちません: 整数を渡すことができ[0..n]
、ライブラリから整数 (現在のところ) を返すことができます。覚えておいてください: ライブラリは役に立たず、ただのデモです。インターフェイスも非常に単純です。この関数LTIData lti_new_data(int n)
は (整数を渡した後)、C ライブラリの割り当てられたデータを含むある種の不透明なオブジェクトを返します。ライブラリには 2 つのアクセサ関数int lti_element_count(LTIData data)
ともint lti_get_element(LTIData data, int n)
あり、前者は要素の数を返し、後者は要素を返しますn
。ああ、最後になりましたが、ライブラリのユーザーは、ライブラリを使用した後、 を使用して不透明を解放する必要がありLTIData
ますvoid lti_free_data(LTIData data)
。
低レベルの Haskell バインディング
低レベルの Haskell Binding は、C2HS を使用してセットアップされます。
高レベル Haskell API
また、お楽しみとして、低レベル API バインディングを使用する一種の高レベル Haskell APIと、高レベル API を使用する単純なドライバー プログラムもセットアップしました。ドライバ プログラムと valgrind などを使用すると、リークしたメモリを簡単に確認できます (p_1, p_2, ..., p_n
ライブラリが\sum_{i = 1..n} 1 + p_i
割り当てを行うすべてのパラメータについて、以下のように簡単に確認できます)。
デモの現状
次のように入力するだけで、プロジェクトを複製、コンパイル、実行できるはずです。git clone https://github.com/weissi/c2hs-experiments.git && cd c2hs-experiments && cabal configure && cabal build && dist/build/TestHsLTI/TestHsLTI
では、問題は何ですか?
問題は、プロジェクトがC2HS を使用Foreign.Ptr
する「管理された」バージョンのみを使用し、それを機能させることができないことです。デモ プロジェクトでは、これらの外部ポインタを使用しようとするファイルも追加しましたが、機能しません :-(。一生懸命試しましたが、成功しませんでした。Foreign.ForeignPtr
{#pointer ... foreign #}
.chs
また、私が理解できないことが 1 つあります。それは、C2HS を使用して GHC にライブラリのデータを解放する方法を伝える方法です。デモ プロジェクトのライブラリにはvoid lti_free_data(LTIData data)
、メモリを解放するために呼び出される関数が用意されています。しかし、GHCはそれを推測することはできません!?! GHC が通常の a を使用する場合free()
、すべてのメモリが解放されるわけではありません :-(.
haskell - char* 型の引数を持つ外部関数に NULL を渡すにはどうすればよいですか?
一部の C プロジェクトへの Haskell バインディングを作成していますが、次の型の関数があります。
問題は、foo
このポインターのNULL
値をチェックし、通常の動作とは異なることを行うことです。私の Haskell ソース ラッパーでは、この関数の型と内部をfoo :: String -> IO ()
使用して引数をマーシャリングしています。newCString
どうすればユーザー能力パスをNULL
そこに与えることができるのだろうか? 以来、それがnewCString ""
私に与えることを期待していましたが、そうではありません。0
"" /= "\0"
今のところ私が見る唯一の方法は、ユーザーが望んNULL
でいる指標として "" を使用することですが、それはハックのようです。この問題は非常に一般的であると予想していますが、SOに関する質問は見つかりませんでした。
haskell - Mac OS X 10.7.5 での c2hs インストール エラー
でc2hsをインストールしようとしていcabal install c2hs
ます。~/.cabal/bin
事前にバイナリをインストールするように作成しました。
コマンドcabal install c2hs
でエラーを取得します。
インストールの何が問題になっていますか? ghc のバージョンは 7.6.3 です。
haskell - c2hs を使用して void* をマーシャリングする
私のC関数は次のようになります。
私の.chs
ファイルは次のようになります。
これは私が得るエラーです:
Ptr ()
c2hs のドキュメントにvoid ポインター ( ) に関する言及が見つかりません。これをマーシャリングするにはどうすればよいですか?