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

haskell - Windowsでのc2hsの使用

私はWindowsでlibxml-enumeratorパッケージを使用しようとしていますが、これは(最終的には)c2hsを使用する必要があります。関連するパッケージをビルドしようとすると、c2hsから一見悪名高い「存在しない」エラーが発生します。これはGCCがインストールされていないことに関連しているようですが、Haskellのgcc.exeのコピーをパスに追加したため、これは奇妙なリストのようです。

誰かがこのバグを打ち負かす方法を知っていますか?

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

haskell - haskell と c のインターフェース

haskell で midori プラグインを作れたらいいなとずっと思っていたのですが、なかなか無理そうです。問題は、ghc コンパイラが大量の -u スイッチを使用するため、ffi を介して haskell 関数をエクスポートすることにあります。

gcc を ghc に置き換えることなく、同様のコンテキストで haskell が使用されているのを見た人はいますか? もしそうなら、それはどのようにうまくいき、彼らはどのような苦労をしましたか?

編集:いくつかの例が要求されたので、ここに:

export.hs

test.c (ifdefs を省略)

でコンパイルするとghc --make -no-hs-main export.hs test.c、機能する a.out 実行可能ファイルが作成されます。ghc は、リンクに次のコマンドを使用します。

collect2 --build-id --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o a.out -z relro -u ghczmprim_GHCziTypes_Izh_static_info -u ghczmprim_GHCziTypes_Czh_static_info -u ghczmprim_GHCziTypes_Fzh_static_info -u ghczmprim_GHCziTypes_Dzh_static_info -u base_GHCziPtr_Ptr_static_info -u base_GHCziWord_Wzh_static_info -u base_GHCziInt_I8zh_static_info -u base_GHCziInt_I16zh_static_info -u base_GHCziInt_I32zh_static_info -u base_GHCziInt_I64zh_static_info -u base_GHCziWord_W8zh_static_info -u base_GHCziWord_W16zh_static_info -u base_GHCziWord_W32zh_static_info -u base_GHCziWord_W64zh_static_info -u base_GHCziStable_StablePtr_static_info -u ghczmprim_GHCziTypes_Izh_con_info -u ghczmprim_GHCziTypes_Czh_con_info -u ghczmprim_GHCziTypes_Fzh_con_info -u ghczmprim_GHCziTypes_Dzh_con_info -u base_GHCziPtr_Ptr_con_info -u base_GHCziPtr_FunPtr_con_info -u base_GHCziStable_StablePtr_con_info -u ghczmprim_GHCziBool_False_closure -u ghczmprim_GHCziBool_True_closure -u base_GHCziPack_unpackCString_closure -u base_GHCziIOziException_stackOverflow_closure -u base_GHCziIOziException_heapOverflow_closure -u base_ControlziExceptionziBase_nonTermination_closure -u base_GHCziIOziException_blockedIndefinitelyOnMVar_closure -u base_GHCziIOziException_blockedIndefinitelyOnSTM_closure -u base_ControlziExceptionziBase_nestedAtomically_closure -u base_GHCziWeak_runFinalizzerBatch_closure -u base_GHCziTopHandler_runIO_closure -u base_GHCziTopHandler_runNonIO_closure -u base_GHCziConc_ensureIOManagerIsRunning_closure -u base_GHCziConc_runSparks_closure -u base_GHCziConc_runHandlers_closure /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o -L/usr/lib/ghc-6.12.1/base-4.2.0.0 -L/usr/lib/ghc-6.12.1/integer-gmp-0.2.0.0 -L/usr/lib/ghc-6.12.1/ghc-prim-0.2.0.0 -L/usr/lib/ghc-6.12.1 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -L/usr/lib/gcc/i486-linux-gnu/4.4.3 -L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i486-linux-gnu/4.4.3/../../.. -L/usr/lib/i486-linux-gnu export.o export_stub.o test.o -lHSbase-4.2.0.0 -lHSinteger-gmp-0.2.0.0 -lgmp -lHSghc-prim-0.2.0.0 -lHSrts -lm -lffi -lrt -ldl -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crtn.o

前のコマンドからスイッチ (-l、-L、およびいくつかの追加フラグのみを残す) を削除する-uと、コンパイルされずに返されます (および約 50 行ほど)。

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

ruby - ScrAPI gemのインストールエラー:ffiにはRubyバージョン>=1.9.2が必要です

ScrAPIgemのインストールで問題が発生しました。

エラー:scrapiのインストール中にエラーが発生しました:ffiにはRubyバージョン>=1.9.2が必要です。

RVMを実行していますが、ruby -vを実行すると、次のようになります。

ruby -v ruby​​ 1.9.2p110(2010-12-20リビジョン30269)[i686-linux]

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

c - Haskell と C の間で構造化データを交換する

まず、私は Haskell の初心者です。

リアルタイム ゲーム用に Haskell を C に統合することを計画しています。Haskell はロジックを行い、C はレンダリングを行います。これを行うには、ティックごとに (少なくとも 1 秒あたり 30 回) 巨大で複雑に構造化されたデータ (ゲームの状態) を相互にやり取りする必要があります。したがって、渡すデータは軽量でなければなりません。この状態データは、メモリ上のシーケンシャル スペースに置くことができます。Haskell と C の両方のパーツは、状態のすべての領域に自由にアクセスする必要があります。

最良の場合、データを渡すコストは、ポインタをメモリにコピーすることです。最悪の場合、変換でデータ全体をコピーします。

Haskell の FFI ( http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs ) を読んでいます。Haskell コードは、メモリ レイアウトを明示的に指定しているように見えます。

いくつかの質問を聞きたいんです。

  1. Haskellはメモリレイアウトを明示的に指定できますか? (C 構造体と正確に一致する必要があります)
  2. これは実メモリ レイアウトですか。または、何らかの変換が必要ですか?(パフォーマンスのペナルティ)
  3. Q#2 が true の場合、メモリ レイアウトを明示的に指定するとパフォーマンスが低下しますか?
  4. 構文は何#{alignment foo}ですか? これに関するドキュメントはどこにありますか?
  5. 巨大なデータを最高のパフォーマンスで渡したい場合、どのようにすればよいですか?

*PS 私が言った明示的なメモリ レイアウト機能は、C# の [StructLayout] 属性です。これは、メモリ内の位置とサイズを明示的に指定しています。 http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Haskell が C 構造体のフィールドと一致する言語構造を持っているかどうかはわかりません。

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

c - 一般的な Lisp、CFFI、および c 構造体のインスタンス化

この「問題」の解決策を探して、約 3 時間、Google で検索しました。CFFIを使用してLispでC構造をインスタンス化する方法を理解しようとしています。私はcに構造体を持っています:

シンプルですよね?この構造体への自動生成されたCFFIバインディング(swigだと思います)があります:

これにより、スロット :X および :Y を持つ構造体 "VECT" が生成されます。これは、foreign-slot-names によって確認されます (バインディングを生成したり、C ライブラリ (シマリスの物理学) をプログラムしたりしていないことに注意してください) が、実際の関数は Lisp から呼び出されています)。大丈夫です)。

私は広範囲に検索しましたが、おそらく 100 回は見たことがありますが、他の関数で使用するために Lisp で cpVect のインスタンスを作成する方法がわかりません。

関数に注意してください。

cpVect だけでなく、一連の cpVect へのポインターも受け取るため、2 番目の質問が発生します。構造体のセットへのポインターを作成するにはどうすればよいですか?

http://common-lisp.net/project/cffi/manual/html_node/defcstruct.htmlに行ってコードを試してみましたが、「エラー: バインドされていない変数: PTR」が表示されます (私は Clozure CL を使用しています)。言うまでもなく、インスタンスではなくポインターのみを返すように見えます。

私はLispの初心者で、これまでのところかなりうまくいっていますが、これは私が理解できない最初の本当の問題です。ありがとう!

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

ruby - RubyFFIのヘルプ

MIDI入力デバイス(キーボード)から情報を印刷するために、いくつかの基本的なWindows呼び出しを実行しようとしています。呼び出しは機能しているように見えますが、midiInOpenとmidiInStartへの最初の2つの呼び出しはとを返しMMSYSERR_NOMEMますMMSYSERR_INVALHANDLE。それは何か関係があると思いますが、ptr = FFI::MemoryPointer.new(:pointer)それを理解するのに十分なFFIについては知りません。どんな助けでも大歓迎です。

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

python - Python ctypes の構造体に offsetof() を実装する

ctypes の構造体に offsetof を実装できないようです。ctypesの FAQ を見ました が、動作しないか、詳細がわかりません。

addressof()構造体メンバー (例) では機能しないようd.weightです。pointer()とを含む他のことをbyref()試しましたが、うまくいきません。

もちろん、ポインターのサイズやパディングの影響に関係なく、すべてのアーキテクチャでこれが機能することを望んでいるので、以前のすべての要素の sizeof() を合計するとは言わないでください。 Cコンパイラが追加するパディングを考慮しています。

何か案は?ありがとう!

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

haskell - 格納可能な空データ宣言

C ライブラリの Haskell ラッパーを作成しようとしています。基礎となる構造体は複雑すぎて明示的な型として表現できず、実際には C 関数間の受け渡し以外には使用しないのでEmptyDataDecls、GHC に解決してもらうために使用しています。

必要なのは、これらのデータ型のいずれかへのポインターですが、それを使用して作成しようとするallocaと、データが type ではないと不平を言いStorableます。例えば:

GHC は、 のインスタンスがないと言って、これをコンパイルしませんStorable Struct。私はそれを自分で実装できます:

しかし、それは目的を打ち負かすことに近づいています-構造体の内容を気にしないのであれば、そのようなものを定義する必要はありません。

クラスPtrStorable. したがって、呼び出す前にpeekonを使用することで、目的を達成できます。ptrget_struct

ただし、これはハックのように感じます。

Storableインスタンスを定義せずに空のデータ宣言を考慮する方法はありますか?

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

c - 正しい Haskell C タイプを選択するには?

私はいくつかの Haskell プログラミング言語を勉強しましたが、C プログラムから Haskell 関数を呼び出すことができることを知りました。Haskell の研究中に、Haskell で単語頻度カウンターを作成しました。その関数を C プログラムから呼び出したいのですが、その方法がわかりません。haskell.org で次の 2 つの Web サイトを見つけました。

C から Haskell を呼び出す

外部 C タイプ (Haskell モジュール)

それにもかかわらず、どのタイプを使用するか少し迷っています。私の haskell プログラムは、次の関数のパイプラインです。

putStr 。線を外します。マップ testF 。並べ替えられたツリー

自分が機能する場所

  • testFは testF の型です:: Show a => ([Char],a) -> [Char]
  • sortedTreeは sortedTree の型です:: (Num a, Ord a) => [Char] -> [([Char],a)]

パイプラインを呼び出す関数だけを変換するのではなく、各関数の型を C 型に変換する必要があることは確かです。「メイン」関数のタイプは

fileFreq :: [文字] -> IO ()

これらすべてに加えて、プレリュード タイプではない Haskell バイナリ ツリーを使用しています。

Haskell コード全体は次のとおりです。

誰でもこれで私を少し案内できますか?

0 投票する
6 に答える
14278 参照

python - Python から Haskell 関数を呼び出す

Python からいくつかの Haskell ライブラリ (Darcs、Pandoc など) を使用したいのですが、Python には Haskell への直接の外部関数インターフェイスがないようです。それを行う方法はありますか?