問題タブ [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.
c - Ruby C API を使用したモジュール内のクラスの定義
Ruby C API を使用してモジュール内にクラスを定義しようとしています。ただし、これがネット全体で行われているのを見た方法は、私にはうまくいかないようです。具体的には、最上位モジュールが作成されますが、モジュール内でクラスが見つかりません。ここに私のCファイルがあります:
ここに私のextconf.rbがあります:
これが私のテストスクリプトです:
誰でも助けることができますか?
ruby - C-APIでのPythonモジュールのセマンティクスとRubyモジュールのセマンティクス
私は長い間Pythonを使用していて、Rubyをいじり始めたばかりですが、特にC-APIで見ると、2つの言語のモジュールの違いが非常にわかりにくいことがわかりました。たとえば、これは小さなルビーCモジュールです
インポートしてそのように呼び出すと
Pythonのモジュールが機能するのと同じように機能することを期待していました。ただし、PyModule
クラスを拡張するためにを使用するか、を使用する必要があることがわかりましたinclude "PyModule"
。PyModule
Pythonのセマンティクスと同様に、これらの関数をモジュールオブジェクトにアタッチする方法を探しています。また、Rubyで実際に何が起こっているのかが気になります。
c++ - C/C++ 構造を Ruby にバインドするにはどうすればよいですか?
C/C++ 構造を Ruby にバインドする方法についてアドバイスが必要です。いくつかのマニュアルを読み、クラス メソッドをクラスにバインドする方法を見つけましたが、構造体フィールドをバインドして Ruby でアクセスできるようにする方法をまだ理解していません。
私が使用しているコードは次のとおりです。
Ruby 関数はそれa
がポインターであると想定しているようです。ポインターの実際の内容 (つまり ) ではなく、ポインターの数値を出力します["Masha", 24]
。明らかに、Ruby 関数はこのオブジェクトを認識できません。オブジェクトのプロパティ名と型を設定していません。
これどうやってするの?残念ながら、私はそれを理解することはできません。
ruby - OS に応じて extconf.rb から生成される出力を制御する方法は?
Ruby C 拡張機能を作成しています。WindowsおよびOSXでコンパイルします。
私がうまくいかなかったのは、メイクファイルと残りのすべての生成されたファイルが配置される場所を制御することです。
私の extconf.rb ファイルには、OS に応じて makefile を準備するための条件文が含まれているため、両方に 1 つを使用しています。
OSX でコンパイルするときは、すべてを osx フォルダーに配置し、同様に Windows では win フォルダーの下に配置して、すべてを分離しておくようにしたいと思います。
現在、すべてのファイルはソースコードと同じフォルダーに生成されています。
(私は C とアプリケーションのコンパイルに非常に慣れています。何か明らかなことを見逃していたら申し訳ありません。)
後でファイルを移動するためのバッチを作成することもできますが、生成中に実行できた方がクリーンだと思います。
ruby - rubygem で他のビルドシステムを使用するにはどうすればよいですか?
の柔軟性がないmkmf
ため、C コードの管理が難しくなっています。このため、別のビルド システムを使用したいと考えています。
C 拡張機能をビルドするには何がrubygems
必要ですか? autotools
/のようなビルド システムconfigure
をワークフローに統合するにはどうすればよいですか?
c - rb_requireとrb_protectを使用してRubyをCに埋め込む
次の例のように、rb_requireをrb_protectと一緒に使用したいと思います。
しかし、コンパイルすると、次のエラーが発生します。
Googleで検索してrb_requireをrb_protectで使用する方法を確認した後、次のことを試しました。
また
しかし、私はいつも同じエラーを受け取ります。このエラーはコンパイルを停止しませんが、起動するとバイナリsegfaultが発生しますが、rb_protectがなくてもすべてが機能します。
__編集__
ソースファイルにエラーがありました。実際、私がテストしたすべてのソリューションはうまく機能します。
また
また
ありがとう
c - rb_class_new_instance で "ArgumentError: wrong type" が発生する - なぜ?
私の Ruby C 拡張機能Geom::Vector3d
から、Google SketchUp Ruby API から新しいインスタンスを作成したいと思いました: https://developers.google.com/sketchup/docs/ourdoc/vector3d
私の最初のコードはこれでした:
ただし、これによりエラーが発生しました。
代わりに、ルビーnew
メソッドを呼び出す必要がありました。
Geom::Point3dとSketchup::Colorで同じ問題に遭遇しました。
rb_class_new_instance
は、Ruby C で新しいインスタンスを作成するための推奨される方法ですよね? なぜ私が電話する必要があるのか 誰にも分かりましたnew
か?クラスが SketchUp でどのように定義されたかについて、奇妙な点はありますか?
c - Ruby拡張機能のVALUE*の配列でマーキングをどのように実行する必要がありますか?
オブジェクトの配列を表す配列を含む行列型がありvoid*
ます(たとえば、すべてのC整数、すべてのfloat、double、さまざまな構造体、場合によってはすべてのRubyなど、特定の行列の1つの型すべてですVALUE
) 。
sの行列を作成しようとするまで、メモリ割り当てとガベージコレクションは正しく機能しているようVALUE
です。
次のマーク関数を定義しています。
したがって、実際にVALUE
行列である場合にのみマーキングを行います。それ以外の場合は、マーク関数NULL
に渡されます。Data_Wrap_Struct
VALUE
しかし、いくつかの行列関数をテストすると、セグメンテーション違反が発生します(要点を参照)。
VALUE*
具体的には、配列の最初のオブジェクトでRubyメソッドを初めて呼び出そうとすると、セグメンテーション違反が発生するようです。
nm_id_mult
Init
私の関数でとして定義されたグローバルrb_intern("*")
です。
これはガベージコレクションの問題ではない可能性がありますが、GCは私が最も理解していないRubyの一部です。また、私のセグメンテーション違反も、投稿者がGCに起因するこのトレースとほぼ同じです。
だから、私の質問:
VALUE
GCの場合、 sの配列をマークする適切な方法は何ですか?GCでない場合、このタイプのエラーを診断するにはどうすればよいですか?私はそのようなものを見たことがありません。
編集:
VALUE
これは、 Cで作成されたsの初期化に失敗した例であることがわかりました。
つまり、*(VALUE*)a = INT2FIX(0)
にアクセスする前に必ず実行してくださいa
。
私はまだその質問が適切だと思います。StackOverflowやその他の場所で、クリーンアンドスイープガベージコレクションのマーキングの本当に良い例を見つけることができませんでした。そのような例や説明を提供していただければ、それをこの質問に対する正解としてマークします。
ruby - C 拡張で rubygem を開発する場合、Rspec を使用してローカルでどのようにテストしますか?
C拡張を含む宝石を書いています。通常、gem を作成するときは、TDD のプロセスに従います。このプロセスでは、失敗した仕様を作成し、合格するまでコードに取り組みます。
「ext/mygem/mygem.c」に C 拡張機能があり、有効な extconf.rb が gemspec の「拡張機能」に構成されている場合、C 拡張機能をロードしたままスペックを実行するにはどうすればよいですか? C コードを変更した場合、コードを再コンパイルするにはどのような手順を実行する必要がありますか?
これはおそらくばかげた質問ですが、gem の開発ソース ツリー内から 'bundle install' と入力しても、ネイティブ エクステンションはビルドされません。手動で実行するruby ext/mygem/extconf.rb
と (プロジェクト全体のルートに) Makefile が取得され、次に実行するとmake
(プロジェクト全体のルートに) 共有オブジェクトが取得されます。.so は lib/. 開発中に手作業でそれを行うことになっている場合を除きますか?
c - CAPIでrubyのBigDecimalを使用する
Ruby拡張機能のC文字列からBigDecimalを作成するために、私はこれを行っています:
これを行うためのより短い方法はありますか?
また、ばかげた質問ですが、C API(ruby 1.9.3)の「公式」ドキュメントはありますか、それともヘッダーを読むだけですか?