問題タブ [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.
ruby-on-rails - ライブラリが利用可能な場合のネイティブC拡張
一意の識別子を生成するためのネイティブC拡張Rubygemを構築しています(ここにあります)。ライブラリで可能であれば(C拡張機能を介して) libuuidを使用し、単純なRuby実装にフォールバックしたいと思います。現在、UUIDを生成するためのCコードとRubyコードの両方がありますが、正常なフォールバックを構成する方法がわかりません。何か案は?
c - C 拡張機能が一意のインスタンスを作成しないのはなぜですか?
私は C エクステンションを作成しました。その目的は、一連のカードがストレートになるかどうかを判断することです。この例は、問題を示すために必要以上に複雑かもしれませんが、基本的に foo は、評価されたすべてのカード (それぞれに割り当てられたインデックスを持つ) を内部に格納する必要があります。したがって、bar には完全に別個のカードとインデックスのセットが必要です。しかし、カードを bar に割り当て始めると、foo が上書きされているようです。ポインターに問題がある場合に備えて、以下にコードを含めます。
.h ファイル
c - インスタンス間で外部変数を共有しないようにするにはどうすればよいですか?
編集:以前は非常に具体的ではなかったため、これは質問の書き直しです。
そのため、C 拡張機能のインスタンス間で共有される変数の問題を解決するのに問題があります。これが私が遭遇しているものの例です。
以下のコードでの最善の解決策は、次のように設定できる ruby 変数を単純に使用することでしょうか。
それとも、私が見ていない、または理解していない C の解決策はありますか?
コード:
c - RARRAY_LENが割り当てられていないのはなぜですか?
C拡張メソッドを使用して新しいruby配列を作成していますが、RARRAY_LENが設定されていません。私は何か間違ったことをしていますか?
出力:
c - c 拡張機能で作成されたオブジェクトは、インスタンス化して相互に管理できますか?
現在、C 拡張機能を使用して作成された一連のオブジェクトがあるので、それらは
- フー
- バー
- バズ。
それらの 3 つをインスタンス化し、それらの関数を呼び出し、結果を処理する ruby コードがあります。それを呼びましょう:
- マネジャー
さて、今は Manager がボトルネックになっているので、C 拡張にしたいと思います。しかし、Manager 内から Foo、Bar、および Baz をインスタンス化する方法がわかりません。次のようなコードを使用する必要がありますか?
そして、次のようなメソッドを呼び出します。
または、よりクリーンな方法はありますか?
c - 一部のrubyC拡張配列メソッドを直接使用できるのに、他のメソッドは使用できないのはなぜですか?
私はrubyコードベースのarray.cにある配列メソッドの多くを使用していますが、
このエラーが発生しました:
私のコードの他の領域では、rb_ary_sort_bang、rb_ary_clear、rb_ary_reverseなどを使用しています。したがって、rb_ary_andがなぜ異なるのかわかりません。
c - この C 拡張でインスタンスを参照する方法に何か問題がありますか?
この C 拡張機能を Rails 環境の外で実行すると機能するが、Rails 内で実行するとスタック ダンプが発生するという問題がいくつかあります。
次のエラー メッセージが表示されます。
これはおそらく、EV::Counters 評価関数内で行っている呼び出し、呼び出している 3 つのインスタンスに存在する「評価」関数を参照しています。
奇妙なことに、valgrind でエラーが発生していません。しかし、インスタンスを参照する方法で間違っている可能性のある基本的なことがあると思いますか?
c - ルビーC拡張機能でオプションハッシュ値を型チェックするときのベストプラクティスは何ですか?
私はrubyのC拡張機能を開発しています。アクセスしているCライブラリの関数の1つは、ruby-worldのオプションハッシュに自然に変換されるように見えるオプション構造体を受け取ります。
ルビー側のハッシュが特定のオプションの値を定義していない場合、構造体は既知のデフォルト値で初期化されます。C側では、これらの線に沿っていくつかあります。
今私の問題は、オプションに定義された値があるが、ルビー型がCでは意味をなさない場合です。
オプションの値でもタイプエラーを発生させる必要がありますか?それはやり過ぎのようですが、デフォルトにフォールバックする必要がありますか?デフォルトにフォールバックする際の問題は、ユーザーが{"opt1" => 123}を渡すと、悪い考えのように思われるopt1を定義していない場合と同じ動作が表示されることです。フォールバックして、ルビーの警告を出力する必要がありますか?(人々はそれらを読むことさえありますか?)
c - Ruby C 拡張 API に関する質問
そのため、最近、Ruby 用の C 拡張機能を作成する必要がありました (パフォーマンスのため)。私は理解に問題を抱えていたのでVALUE
(そして今でもそうです)、Rubyソースを調べて見つけました:(typedef unsigned long VALUE;
Link to Source、しかし、それが行われる他のいくつかの「方法」があることに気付くでしょうが、それは本質的にlong
; 間違っていたら訂正してください)。そのため、これをさらに調査しているときに、次のような興味深いブログ投稿を見つけました。
「...場合によっては、データを指すのではなく、値オブジェクトがデータである可能性があります。」
私を混乱させるのは、Ruby から C に文字列を渡しRSTRING_PTR();
て (Ruby から C 関数に渡された) を使用し、それを使用しVALUE
て「デバッグ」しようとすると、 4strlen();
が返されることです。常に4.
コード例:
この例では、文字列の長さとして常に 1 が返されます。
ruby では、「モジュールを文字列に変換できません」という例外が表示されることがあります (または、これらの行に沿った何か、ただし、これを理解しようとしてコードをいじっていたので、今はエラーを再現できません私が試したときにエラーが発生しましたStringValuePtr();
[これが正確に何をするのか少しわかりません。ドキュメントには、渡さchar*
れたパラメーターが inp の ] に変更されると書かれています):
したがって、問題の Ruby コードは次のとおりです。MyMod::test("blahblablah")
編集: いくつかのタイプミスを修正し、投稿を少し更新しました。
質問
- 正確には何が
VALUE imp
保持されますか?オブジェクト/値へのポインタ? 価値そのもの? - 値自体を保持している場合:いつそれを行い、それを確認する方法はありますか?
- 実際に値にアクセスするにはどうすればよいですか (値以外のほとんどすべてにアクセスしているように見えるため) 。
PS: C についての私の理解は、実際には最善ではありませんが、進行中の作業です。また、追加の説明については、コード スニペットのコメントをお読みください (役立つ場合)。
ありがとう!
c - cでのruby Exceptionクラスオブジェクトの拡張とは?
こんにちは、ルビースクリプトから呼び出されるcの次のコードがあります。
以下は、Ruby クライアント スクリプトのコードです。
Ruby クライアントから myMethod() 関数を呼び出します。cファイルとそのすべての属性で例外クラスオブジェクト「exc」にアクセスする方法を教えてください。