問題タブ [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.
haskell - Windowsでのc2hsの使用
私はWindowsでlibxml-enumeratorパッケージを使用しようとしていますが、これは(最終的には)c2hsを使用する必要があります。関連するパッケージをビルドしようとすると、c2hsから一見悪名高い「存在しない」エラーが発生します。これはGCCがインストールされていないことに関連しているようですが、Haskellのgcc.exeのコピーをパスに追加したため、これは奇妙なリストのようです。
誰かがこのバグを打ち負かす方法を知っていますか?
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 行ほど)。
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]
c - Haskell と C の間で構造化データを交換する
まず、私は Haskell の初心者です。
リアルタイム ゲーム用に Haskell を C に統合することを計画しています。Haskell はロジックを行い、C はレンダリングを行います。これを行うには、ティックごとに (少なくとも 1 秒あたり 30 回) 巨大で複雑に構造化されたデータ (ゲームの状態) を相互にやり取りする必要があります。したがって、渡すデータは軽量でなければなりません。この状態データは、メモリ上のシーケンシャル スペースに置くことができます。Haskell と C の両方のパーツは、状態のすべての領域に自由にアクセスする必要があります。
最良の場合、データを渡すコストは、ポインタをメモリにコピーすることです。最悪の場合、変換でデータ全体をコピーします。
Haskell の FFI ( http://www.haskell.org/haskellwiki/FFICookBook#Working_with_structs ) を読んでいます。Haskell コードは、メモリ レイアウトを明示的に指定しているように見えます。
いくつかの質問を聞きたいんです。
- Haskellはメモリレイアウトを明示的に指定できますか? (C 構造体と正確に一致する必要があります)
- これは実メモリ レイアウトですか。または、何らかの変換が必要ですか?(パフォーマンスのペナルティ)
- Q#2 が true の場合、メモリ レイアウトを明示的に指定するとパフォーマンスが低下しますか?
- 構文は何
#{alignment foo}
ですか? これに関するドキュメントはどこにありますか? - 巨大なデータを最高のパフォーマンスで渡したい場合、どのようにすればよいですか?
*PS 私が言った明示的なメモリ レイアウト機能は、C# の [StructLayout] 属性です。これは、メモリ内の位置とサイズを明示的に指定しています。 http://www.developerfusion.com/article/84519/mastering-structs-in-c/
Haskell が C 構造体のフィールドと一致する言語構造を持っているかどうかはわかりません。
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の初心者で、これまでのところかなりうまくいっていますが、これは私が理解できない最初の本当の問題です。ありがとう!
ruby - RubyFFIのヘルプ
MIDI入力デバイス(キーボード)から情報を印刷するために、いくつかの基本的なWindows呼び出しを実行しようとしています。呼び出しは機能しているように見えますが、midiInOpenとmidiInStartへの最初の2つの呼び出しはとを返しMMSYSERR_NOMEM
ますMMSYSERR_INVALHANDLE
。それは何か関係があると思いますが、ptr = FFI::MemoryPointer.new(:pointer)
それを理解するのに十分なFFIについては知りません。どんな助けでも大歓迎です。
python - Python ctypes の構造体に offsetof() を実装する
ctypes の構造体に offsetof を実装できないようです。ctypesの FAQ を見ました が、動作しないか、詳細がわかりません。
addressof()
構造体メンバー (例) では機能しないようd.weight
です。pointer()
とを含む他のことをbyref()
試しましたが、うまくいきません。
もちろん、ポインターのサイズやパディングの影響に関係なく、すべてのアーキテクチャでこれが機能することを望んでいるので、以前のすべての要素の sizeof() を合計するとは言わないでください。 Cコンパイラが追加するパディングを考慮しています。
何か案は?ありがとう!
haskell - 格納可能な空データ宣言
C ライブラリの Haskell ラッパーを作成しようとしています。基礎となる構造体は複雑すぎて明示的な型として表現できず、実際には C 関数間の受け渡し以外には使用しないのでEmptyDataDecls
、GHC に解決してもらうために使用しています。
必要なのは、これらのデータ型のいずれかへのポインターですが、それを使用して作成しようとするalloca
と、データが type ではないと不平を言いStorable
ます。例えば:
GHC は、 のインスタンスがないと言って、これをコンパイルしませんStorable Struct
。私はそれを自分で実装できます:
しかし、それは目的を打ち負かすことに近づいています-構造体の内容を気にしないのであれば、そのようなものを定義する必要はありません。
クラスPtr
がStorable
. したがって、呼び出す前にpeek
onを使用することで、目的を達成できます。ptr
get_struct
ただし、これはハックのように感じます。
Storable
インスタンスを定義せずに空のデータ宣言を考慮する方法はありますか?
c - 正しい Haskell C タイプを選択するには?
私はいくつかの Haskell プログラミング言語を勉強しましたが、C プログラムから Haskell 関数を呼び出すことができることを知りました。Haskell の研究中に、Haskell で単語頻度カウンターを作成しました。その関数を C プログラムから呼び出したいのですが、その方法がわかりません。haskell.org で次の 2 つの Web サイトを見つけました。
それにもかかわらず、どのタイプを使用するか少し迷っています。私の haskell プログラムは、次の関数のパイプラインです。
putStr 。線を外します。マップ testF 。並べ替えられたツリー
自分が機能する場所
- testFは testF の型です:: Show a => ([Char],a) -> [Char]
- sortedTreeは sortedTree の型です:: (Num a, Ord a) => [Char] -> [([Char],a)]
パイプラインを呼び出す関数だけを変換するのではなく、各関数の型を C 型に変換する必要があることは確かです。「メイン」関数のタイプは
fileFreq :: [文字] -> IO ()
これらすべてに加えて、プレリュード タイプではない Haskell バイナリ ツリーを使用しています。
Haskell コード全体は次のとおりです。
誰でもこれで私を少し案内できますか?
python - Python から Haskell 関数を呼び出す
Python からいくつかの Haskell ライブラリ (Darcs、Pandoc など) を使用したいのですが、Python には Haskell への直接の外部関数インターフェイスがないようです。それを行う方法はありますか?