問題タブ [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 に答える
134 参照

haskell - LIRCとHaskellのインターフェース

Pythonで小さなアプリケーションのプロトタイプを作成するときにpyLircを使用してきました。パフォーマンス上の理由から(とりわけ)Haskellに移動していますが、同様の機能を提供するモジュールが見つかりません。「lirc_client.h」をそのまま使用する必要がありますか、それとも代替手段はありますか?

0 投票する
2 に答える
141 参照

unicode - cffi で使用できるように、LC_XXX ロケール統合定数の値を見つけるにはどうすればよいですか?

私はこのコードを持っています:

そして私はやりたい:

上記の呼び出しに渡すことができるように、さまざまな LC_xxx 定数の整数値を見つけるにはどうすればよいですか? これを達成するためのより良い方法はありますか?

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

macos - OSX、ghci、dylib、正しい方法は何ですか?

いくつかのCコードを作成してから、FFIを介してそのCコードを参照する必要があります。osxのghciの内側からバインディングを使用したいと思います。私の制約の1つは、Cソースを.cabalファイルのghcに渡すことはできないということです。これは、ghcの次のリリースで修正される可能性のあるghc / cabalの制限によるものです(ただし、コードを現在および古いリリースで機能させたい)。詳細については、このバグを参照してください

そのバグの要点は、CコードをいくつかのObjective-Cモジュールでコンパイルする必要があり、ghcがそれらをリンカースクリプトとして誤って解釈することです。私は多くのことを試しましたが、makefileを使用して自分でファイルを作成することだけがうまくいきました。実際には、これは問題にはなりません。自分で作成していない外部Cライブラリを使用することにした場合と同じであるためです。この問題のために、さまざまなオプションを使用して簡単に再構築できる別のCライブラリであるとしましょう。

Cライブラリを.aとしてビルドすると、ghciは.dylibを開くことができないと文句を言います。私の最初の質問は、なぜghciに.dylibが必要なのか、それを実際に使用するのかということです。

dylibをビルドすると、コードをghciにロードするときにセグメンテーション違反が発生します。

このバインディングは、LinuxとWindowsの両方の他のプラットフォームですでに機能しており、ghciを使用する代わりにコンパイルしているときはosxで正常に機能することに注意してください。この問題は、osx/ghciコンボに固有のものです。

上記のトレースでは、gdbを使用していますが、gdbを使用しているかどうかに関係なくクラッシュします。クラッシュの原因となった行まで追跡しました。

問題の原因は、memset行ですが、実際には、ghci内で実行すると、のヒント構造への書き込みが_glfwLibraryメモリアクセス違反になるという問題があります。ヒント構造体は、単なるintの集まりです。それは非常にフラットでシンプルなので、問題は私が物事をリンクする方法またはghciがコードをロードする方法のいずれかに問題があると思います。

dylibと.aをビルドするために使用するmakefileのビットは次のとおりです。

ほとんどのフラグはGLFWMakefileから直接取得されるため、そのライブラリに対して正しいはずだと思います。

最初の行は少し奇妙に見えますが、それは私がこの問題に使用した解決策です。

プラットフォームの詳細:

  • OSX 10.6.6
  • x86_64
  • 4コア
  • Haskellプラットフォームインストーラーを介してインストールされたGHCバージョン7.0.3
  • ソースリポジトリ:https ://github.com/dagit/GLFW-b

編集:ここに私の質問があります:

  • これはghciで動作する必要がありますか?
  • もしそうなら、私は何を間違っているのですか、またはどうすればクラッシュを修正できますか?
  • ghciを使用した静的な.aバージョンのライブラリを使用できますか?
0 投票する
1 に答える
322 参照

haskell - Haskell FFI: トップレベルの FunPtr からトップレベルの関数へ?

FunPtr は、必要なときに (同じ関数に対して) 新しいものを作成してその割り当て解除を処理するのではなく、最上位関数に対して一度だけ作成することが望ましいようです。

以外の FunPtr を取得する方法を見落としていforeign import ccall "wrapper"ますか? そうでない場合、私の回避策は以下のコードのようになります。それは安全ですか?

編集:「毎回新しいものを作成する」バリアント(main = forever (mkSomeCallback f))が実際にメモリをリークしないfreeHaskellFunPtrことを確認しました。

0 投票する
2 に答える
394 参照

haskell - ベクトル (Vector Foo) -> (Ptr (Ptr Foo) -> IO a) -> IO a?

ベクトルのリストを渡す必要がある ac ライブラリの単純なラッパーを作成しています。配列へのポインターの配列を取ります。素敵なインターフェイスを作成するには、Vector (または Vector のリスト) が必要ですが、慣用的な Haskell でこれを行う方法を実際に見つけることはできません。(または、メモコピー以外の方法)。

私が探しているのは次のようなものです

0 投票する
3 に答える
710 参照

haskell - HaskellでFFIを使用したユニオンとタイプ**?

FFI を使用して Union と Type** (int** など) を解決する方法を知りたいですか? 構造体には Storable インスタンスが必要ですが、共用体にも使用できますか?

そのようなユニオン:

これは通常、Haskell では次のように表されます。

私の質問は、どのように myUnion を my_union にマーシャリング (Storable インスタンスを定義) しますか? インスタンス my_union がメモリ内の sizeof(int) バイト、つまり最大のメンバーのサイズを占めることは私の理解です。したがって、これを保存するには、次の行に沿って何かを記述します。

int**また、どのように FFI でa を表すことができますか? int foo(int i1, int* i2); 署名のような関数を取得すると、次のようになります。foo -> CInt -> Ptr CInt -> CInt

しかし、もしあればint foo(int i1, int** i2);

0 投票する
3 に答える
2073 参照

c# - C# での高次 Haskell 型の使用

次のように、C# (DLLImport) の高次型シグネチャを使用して Haskell 関数を使用および呼び出すにはどうすればよいですか?

C#で対応する型シグネチャは何ですか?

さらに(簡単かもしれないので):C#内で「未知の」Haskell型を使用するにはどうすればよいですか?C#が特定の型を知らなくても、少なくともそれらを渡すことができますか?私が知っておくべき最も重要な機能は、型クラス (Monad や Arrow など) を渡すことです。

Haskell ライブラリを DLL にコンパイルしてC# 内で使用する方法は既に知っていますが、一次関数についてのみです。Stackoverflow - Call a Haskell function in .NETWhy isn't GHC available for .NET and hs-dotnetについても認識しています。ここでは、ドキュメントとサンプルが見つかりませんでした (C# から Haskell 方向)。

0 投票する
2 に答える
254 参照

opengl - Haskell で Ptr GLubyte -> IO() 型の関数を呼び出す方法

OpenGL Raw ライブラリには、次の関数があります。

この関数に対応する C は配列へのポインターを受け入れますが、Haskell プログラムで配列/リストを使用してこの関数を呼び出すにはどうすればよいでしょうか?

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

c - 関数 glMultiDrawElements の呼び出し方 :: GLenum -> GHC.Ptr.Ptr GLsizei -> GLenum -> GHC.Ptr.Ptr (GHC.Ptr.Ptr a) -> GLsizei -> IO ()

ffunctionglMultiDrawElementsには、引数の 1 つとしてポインターへのポインターが必要です。Ptr(Ptr a)StorableArray Int から を取得するにはどうすればよいでしょaうか?