問題タブ [ruby-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.
c - RubyFFIでchar配列を宣言する
私は次のCコードを持っています:
同等のRubyFFI宣言を次のように記述しました(FFI wikiの構造体に関するアドバイスに従います)。
実行すると、次のエラーが発生します。
コールバックでchar配列を正しく宣言していないようです。:pointer
配列がCの関数の引数で機能する方法から、私はの代わりに使用する必要があると思います[:char, 128]
。しかし、FFIの特性についてはよくわかりません。ここで本当に正しい構文は何ですか?
ruby - RubyFFIでネストされた構造体メンバーに割り当てる
次の2つのFFI構造体について考えてみます。
それらをインスタンス化するには:
今、私がこのように割り当てようとするa
とb.nested
:
次のエラーが発生します。
ネストされた構造体が「値によってネストされている」場合、つまりポインタではない場合、FFIでは[]構文を使用して割り当てることができないようです。もしそうなら、どのように私はに割り当てるa
のですb.nested
か?
ubuntu - ruby ffi-inliner を使用した tesseract-ocr gem のコンパイル エラー
次のコードを実行しようとすると、
以下のエラーが表示されます
上記のログ ファイルには、次の内容が含まれています。
私のGemfile.lockには以下が含まれています:
tesseract のバージョン (少なくとも、Ubuntu が提供するバージョン) は 3.02.01-2 です。
これをコンパイルするにはどうすればよいですか?
ruby - FFI - 引数の型が FILE の関数をアタッチしますか?
RubyでFFIを使用してFILE型の引数を受け入れる関数をラップするにはどうすればよいですか?
ruby - 構造体のポインタが参照するruby ffi呼び出し関数?
ruby ffi で libfluidsynth を使用しようとしていますが、サウンドフォントを反復処理してすべての楽器を取得する必要があります。具体的には、_fluid_sfont_t 構造体には、呼び出す必要がある iteration_start および iteration_next 参照があります。
http://fluidsynth.sourceforge.net/api/struct__fluid__sfont__t.html
ffi/ffi のドキュメントで、メンバーが通常の型である構造体のメンバーを参照する方法を確認し、C でコールバックを設定して Ruby Procs を指す方法を確認しました。ただし、構造体の関数ポインターによって参照される関数を呼び出す必要があります。
これはどのように行うことができますか?
c++ - C++ シングルトンを使用して、一度だけ初期化されたオブジェクトを返す方法
私は本物の C++ 初心者なので、しばらくお待ちください。まずは舞台を整えます。
binary.cpp
次のようなバイナリにコンパイルされるC++ ソースがあります。
メソッドは別のsend_auth
オブジェクト コード ファイルから読み込まれ、foobar のインスタンスが渡されます。その理由は、Foobar は、私がソースを持っておらず、複数回インスタンス化してはならない API オブジェクトから来ているからです。
main は 1 回だけ呼び出されるため、すべてが期待どおりに機能します。Foobar のインスタンスは 1 つだけで、send_auth
複数回呼び出すことができます。
バイナリは私には役に立ちません。同じことを行う共有オブジェクト ライブラリが必要です。Foobar のインスタンスを 1 つだけ作成send_with_auth
し、共有オブジェクト ライブラリが読み込まれた後に複数回呼び出すことができる外部インターフェイス メソッドを公開します。
私のライブラリコードはlibrary.cpp
次のようになります。
Ruby FFI を介して共有オブジェクト ライブラリをロードするので、ライブラリに C スタイルのヘッダーがいくつか必要ですlibrary.h
。
ステージ セットを使用して、ライブラリ内で Foobar のインスタンスを 1 回だけ作成し、それを のすべての呼び出しに渡してsend_auth
、Foobar からメモリ違反エラーが発生しないようにする必要があります。
これは、私が理解したシングルトンを使用した(非常に複雑な)試みです。library.h
次のような新しいものがあります:
そして、この実装がありますlibrary.cpp
:
このコードは少なくともコンパイルされ、すべてを共有オブジェクト ライブラリにバインドできます。そのライブラリを外部プロセス (私の場合は Ruby FFI を使用する Ruby モジュール) にロードすると、常にエラーが発生します。
library.o から libfoobar.so への私のコンパイル/バインディング/ストリッピング プロセスは問題ないと確信しています。他のケースでは成功するからです。ここで C++ のシングルトンの概念を誤解していると確信しています。共有オブジェクト ライブラリ内に Foobar のインスタンスを 1 つだけ作成し、それをライブラリが外部に公開する唯一のメソッドのすべての呼び出しに渡すという目標を達成するにはどうすればよいでしょうか。
誰でもそれを助けることができますか?よろしくフェリックス
アップデート
ライブラリで CommandlineParser を使用するのはばかげていました。実際には、単純に 2 つの C 文字列を返しました。API ライブラリ パスとログ ディレクトリ。それで、名前空間を再作成しました:
これにより、ライブラリをロードした瞬間にセグ フォールトが発生します。それとは対照的に、これらの行を関数に直接入れることができます。
send_with_auth
への 2 回目の呼び出しですべてがクラッシュし、Foobar が再度インスタンス化されるという事実を除いて、ここではすべて正常に動作します。
更新 2:
最後に、さらに簡単に解決し、グローバルに利用可能な bool スイッチを使用して Foobar インスタンスを 1 回だけ初期化しました。
send_with_auth
これで、Foobar を複数回インスタンス化することなく、際限なく呼び出すことができます。終わり!
ruby - gem が私の C エクステンションを自動コンパイルしないのはなぜですか?
C 拡張が必要な Ruby gem をビルドします。これは一度コンパイルされると、Ruby FFI を介して gem にバインドされます。
私のセットアップ: gem の足場に bundle を使用します。gems フォルダー内にサブフォルダーがありますext
。これには、静的な Makefile、別のサブフォルダーsource
、および extconf.rb が含まれています。
このsource
フォルダーには、すべての .c および .h ファイルが含まれています。
Makefile を動的に作成する必要はありません。すべてをコンパイルすると、gem は期待どおりに動作しmake clean && make
ます。ext
ここで、extconf.rb に次の内容を指定します。
そこで、最初に mkmf に Makefile を作成させ、後で静的テンプレートで上書きします。バカ。
gem をビルドrake build
して別のマシンにインストールしようとすると、拡張機能がコンパイルされません。
インストール時に拡張機能を自動的にコンパイルするために何をしなければならないか教えてもらえますか?
ruby - Rubyのメソッドの呼び出し元のスコープにモジュールからメソッドを持ち込む方法は?
コードは次のようになります。
さびたコードをインライン化するライブラリを書きたいので、機能が必要なので、次のように書くことができるはずです:
これはルビーで可能ですか?(さらに詳しい情報が必要な場合は、お気軽にお問い合わせください!)