問題タブ [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.

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

c - RubyFFIでchar配列を宣言する

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

同等のRubyFFI宣言を次のように記述しました(FFI wikiの構造体に関するアドバイスに従います)。

実行すると、次のエラーが発生します。

コールバックでchar配列を正しく宣言していないようです。:pointer配列がCの関数の引数で機能する方法から、私はの代わりに使用する必要があると思います[:char, 128]。しかし、FFIの特性についてはよくわかりません。ここで本当に正しい構文は何ですか?

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

ruby - RubyFFIでネストされた構造体メンバーに割り当てる

次の2つのFFI構造体について考えてみます。

それらをインスタンス化するには:

今、私がこのように割り当てようとするab.nested

次のエラーが発生します。

ネストされた構造体が「値によってネストされている」場合、つまりポインタではない場合、FFIでは[]構文を使用して割り当てることができないようです。もしそうなら、どのように私はに割り当てるaのですb.nestedか?

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

ubuntu - ruby ffi-inliner を使用した tesseract-ocr gem のコンパイル エラー

次のコードを実行しようとすると、

以下のエラーが表示されます

上記のログ ファイルには、次の内容が含まれています。

私のGemfile.lockには以下が含まれています:

tesseract のバージョン (少なくとも、Ubuntu が提供するバージョン) は 3.02.01-2 です。

これをコンパイルするにはどうすればよいですか?

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

ruby - FFI - 引数の型が FILE の関数をアタッチしますか?

RubyでFFIを使用してFILE型の引数を受け入れる関数をラップするにはどうすればよいですか?

0 投票する
0 に答える
505 参照

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 を指す方法を確認しました。ただし、構造体の関数ポインターによって参照される関数を呼び出す必要があります。

これはどのように行うことができますか?

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

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 を複数回インスタンス化することなく、際限なく呼び出すことができます。終わり!

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

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して別のマシンにインストールしようとすると、拡張機能がコンパイルされません。

インストール時に拡張機能を自動的にコンパイルするために何をしなければならないか教えてもらえますか?

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

ruby - Rubyのメソッドの呼び出し元のスコープにモジュールからメソッドを持ち込む方法は?

コードは次のようになります。

さびたコードをインライン化するライブラリを書きたいので、機能が必要なので、次のように書くことができるはずです:

これはルビーで可能ですか?(さらに詳しい情報が必要な場合は、お気軽にお問い合わせください!)