問題タブ [ruby-c-extension]

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 に答える
183 参照

c - Rubyスクリプトから渡されたCの構造体型変数の構造体メンバーを取得する方法は?

Ruby C拡張を実装しました(つまり、RubyスクリプトからC関数を呼び出します)以下は、ファイル「cFile.c」からcで実装された関数です

以下は、struct 型の変数を渡して functon() メソッドを呼び出す ruby​​ スクリプトのコードです。client.rb:

cFunction() で構造体メンバー (名前、アドレスなど) を取得する方法を教えてもらえますか? 前もって感謝します

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

c - Cでrubyを拡張する - 関数にデフォルトの引数値を指定する方法は?

クラスを生成する C 拡張を ruby​​ に書こうとしています。クラスにいくつかのデフォルト引数を定義する方法を探しています。たとえば、Ruby でこのクラス宣言があるとします。

で初期化できmc = MyClass.new("blah")、 age パラメータが内部で設定されます。Cでこれを行うにはどうすればよいですか? これまでのところ、これを取得しましたが、これにより、他の引数が強制的に入力されます。

の値をチェックするか、を使用することを考えましたageQnilif ( TYPE(age) == T_UNDEF )そこから segfault が発生します。読んでみると、 の値を使用してREADME.EXTこれを達成できると思いますが、これはあまり明確ではありませんでした。何か案は?ありがとう。rb_define_methodargc

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

c - mkmfは、C拡張子をコンパイルするときに、サブフォルダー内のファイルを無視します

Cのソースコードを次のように整理したいと思います。

この設定をで正しく機能させるのに問題がありますmkmfnative_extension/libに含まれているのファイルはnative_extension.c完全に無視されています。

拡張機能をビルドすると、コンパイルされるだけで、実行しようとするとシンボルルックアップエラーが発生native_extension.{h,c}する不完全なメッセージが表示されます。native_extension.{so,dll}

これを機能させる方法はありますか?

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

c++ - Ruby 拡張コードのセグメンテーション違反

私は、Boost::dynamic_bitfield を Ruby で使用できるようにする小さな Ruby 拡張機能を C/C++ で作成しています。私のコードは完全にコンパイルされますが、拡張機能をロードしてクラスをインスタンス化しようとすると、segfault が発生します。

gdb を適切に利用して、エラーまたはエラーが発生している場所を見つけることができませんでした。Init_bitfield問題をor bf_new/に絞り込んだと思いますbf_init

完全なソース: http://pastebin.com/qLkMGYqq

BitField は次のように定義されます。

コードは主に次の記事から着想を得ています: http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html

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

c - Ruby C 拡張機能: イベント ループを同時に実行する

Ruby C 拡張機能として単純なウィンドウ ライブラリを実装しています。Windows にはhandle_events!、ネイティブ イベント ループに入るメソッドがあります。

問題は、ウィンドウごとに 1 つのイベント ループとメソッド ブロックが必要なことです。メソッドがすぐに戻り、ループが別のスレッドで実行されるようにしたいと思います。これを達成するための最良の方法は何ですか?

rb_thread_call_without_gvlイベント ループ関数rb_thread_call_with_gvlを呼び出すために使用してから、s であるウィンドウのコールバックを呼び出すために使用してみましたProc。完全なソース コードはここにあります。

それでも機能しますが、意図したとおりではありません。メソッドはまだブロックされています。これは Ruby のスレッド モデルでも可能ですか?

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

c - Data_wrap_struct とマーク関数

Ruby 拡張機能を作成し、関数を使用していますData_wrap_struct

Ruby のマーク アンド スイープ ガベージ コレクション プロセスに参加するには、構造体を解放するルーチンと、構造体から他の構造体への参照をマークするルーチンを定義する必要があります。クラシックfree関数を渡してメモリを解放しますが、マーク関数の使用方法がわかりません。

私の構造体はこのように聞こえます

collection構造体 Bの参照をマークするには、マーク関数が必要だと思います。

マーク機能がどのように機能するかを確認するための例を誰かに見せてもらえますか?

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

c - Ruby C 拡張機能のコンストラクターの奇妙な動作

Ruby C 拡張機能のクラス コンストラクターで奇妙な動作が見られます。
例を見てください: FooC 拡張であるクラスBarと から継承するクラスがありFooます:

extconf.rb

foo.c

bar.rb

わかりました奇妙なものを見てみましょう...
この状況ではすべてうまくいきます:

と の 2 つのプリントを取得しfoo_newますfoo_init
わかりましたが、この方法でクラスを変更するとBar:

実行すると、最初の奇妙なものがあります

プリントは 1 つだけです: foo_new. そしてfoo_init??
わかりました、コンストラクターへの明示的な呼び出しを追加することで、この問題を回避できますFoo

2 つのプリントを取得します:foo_newfoo_initを呼び出した場合x = Bar.new

2 番目の奇妙な点は次のとおりです。

エラーが発生します

ただし、コンストラクターはBar、デフォルト値を持つ 1 つのパラメーターを受け入れます。
なぜこれ?これはRubyのバグですか?

(ruby1.9.3-p0 [ x86_64 ] でテスト済み)

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

ruby - ruby extconf.rb の例

http://people.apache.org/~rooneg/talks/ruby-extensions/ruby-extensions.html (page 6)の指示に従っていますが、make コマンドは返されるだけです。make: Nothing to be done for 'all'.

誰にもアイデアはありますか?

Ruby 1.9.2 を使用しており、OSX 10.6.8 を使用しています

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

c - Ruby 1.9 C拡張機能でブロックをProcに変換するにはどうすればよいですか?

私はRuby1.9C拡張機能を書いていますが、rubyで次のことを実行したいと思います。

これに伴う問題は、Cメソッドでは、ブロックを「受信」するだけであり、私が知る限り、それはパラメーターでさえないということです。で呼び出すことができますrb_yield

だから私の質問は:Ruby 1.9 C拡張機能に、ブロックをprocなどに変換して、モジュール内に保存し、後で必要なときにいつでも呼び出すことができる方法はありますか?非同期コールバックのように!

私はすでにこれをProcs/lambdasで実装しましたが、ブロック構文を直接使用しないのは醜いです。

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

c - Ruby/Inline C で未定義の数の引数を受け入れる

RubyでインラインCを使って再帰性の高い関数を書き直そうとしています。この関数は未定義の数の引数を受け入れます。つまり、Ruby では次のようになります。

次のコードを使用して、インライン C でこれを模倣しようとしています。

しかし、これはコンパイルエラーを引き起こします:

これはCでこれを達成する正しい方法ですか? もしそうなら、このエラーの原因は何ですか? そうでない場合、それはどのように行われますか?