問題タブ [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 - NUM2LL と NUM2INT を使用して Ruby から C に渡すときに変更されたデータ
このCコードでRubyを拡張することにより、RubyテストでテストしているCモジュールがあります。2 ** 24 -1 を超える数値は変更されています。Ruby と C の間で 64 ビット値をやり取りする必要があり、ビット精度である必要があります。任意の考えをいただければ幸いです。
. . . 私が渡したデータのいくつかの例:
- (2^34 -1) * 16 ==> C は (2^34) * 16 を受け取ります
- (2^34 +1) * 16 ==> C は (2^34) * 16 を受け取ります
- (2^24 +1) * 16 ==> C は (2^24) * 16 を受け取ります
- (2^25 -1) ==> C が (2^25) を受け取る
- (2^24 -1) ==> C が (2^24 -1) を受け取る (正解)
以下の数字も正解です。
ありがとうございました!
ruby - 自分でメモリを解放する場合、ALLOCA_N を使用する必要がありますか?
つるはしより:
場合によっては、オブジェクト ストレージに使用されない拡張機能にメモリを割り当てる必要がある場合があります。たとえば、ブルーム フィルター用の巨大なビットマップ、画像、または Ruby が直接使用しない一連の小さな構造がある場合などです。ガベージ コレクターを正しく使用するには、次のメモリ割り当てルーチンを使用する必要があります。これらのルーチンは、標準の malloc 関数よりも少し多くの作業を行います。たとえば、必要な量のメモリを割り当てることができないと ALLOC_N が判断した場合、ALLOC_N はガベージ コレクタを呼び出して、スペースの一部を再利用しようとします。できない場合、または要求されたメモリ量が無効な場合は、NoMemError が発生します。
しかし、特定の関数では、いつメモリを解放するかを正確に知っています。この場合、ALLOC_N
メモリを割り当てるために引き続き使用する必要がありますか?
自分でメモリを解放する正当なケースはありますか、それとも常に使用ALLOC_N
して気にしない方がよいですか?
ruby - C 拡張機能から Ruby Time オブジェクトを作成する
時間オブジェクトを多用する必要がある Ruby の C 拡張機能を作成しています。このアプリケーションでは、パフォーマンスが重要です。C API から Time オブジェクトを作成して最大のパフォーマンスを得るにはどうすればよいですか? ruby.h インクルード ファイルに関連するものは見つかりませんでした。
ruby - バイナリ データを操作するための Ruby C 拡張機能
固定サイズのバッファー (16 バイト長) で低レベルのバイト操作を行う C 関数と Ruby をインターフェイスする必要があります。
また、これには Ruby 1.8.7 を使用しているため、Ruby がエンコーディングを理解しようとして頭を悩ませることはありません。
文字列のバイナリ データを正しく処理するように、Ruby C インターフェイス コードをライブラリに記述するにはどうすればよいですか? たとえば、固定長の入力文字列のゼロバイトに対して堅牢になりますか?
StringValuePtr() を使用すると、ゼロバイトで壊れます。
これをRubyから次のように呼び出したい:
ruby - 関数の Ruby C 拡張
次の関数の ruby c 拡張を作成する必要がありますAbc_NtkCreateNodeAnd
。
これは ruby c 拡張の例です。
今、私の主な問題は、ポインタを c から ruby に渡す方法です。次のように拡張機能を記述しようとしました。
しかし、私の意見ではコードAbc_Ntk_t *netw_str = StringValueCStr(netw);
は間違っています。では、適切なコードは何ですか?
ruby - gem のインストールでサポートされていない場合、ネイティブ拡張機能は純粋な Ruby にフォールバックします
現在純粋な Ruby である gem を開発していますが、機能の 1 つでより高速な C バリアントも開発しています。この機能は純粋な Ruby で使用できますが、速度が遅い場合があります。速度の遅さは一部の潜在的なユーザーにのみ影響を与えます (ユーザーが必要とする機能とその使用方法によって異なります)。そのため、ターゲット システムでコンパイルできない場合に、Ruby 専用関数への適切なフォールバックで gem を利用できるようにすることは理にかなっています。
この機能の Ruby および C バリアントを 1 つの gem で維持し、インストール時に gem から最高の (つまり最速の) エクスペリエンスを提供したいと考えています。そうすれば、私の 1 つのプロジェクトから、潜在的なユーザーの幅広いセットをサポートすることができます。また、互換性のための最小公分母バージョンとは対照的に、他の人々の依存する宝石やプロジェクトがターゲットシステムで利用可能な最良の依存関係を使用できるようになります。
require
実行時のフォールバックが次のlib/foo.rb
ようにメイン ファイルに表示されることを期待します。
ただし、「foo_extended」をビルドできるかどうかに関係なく、gem が正しくインストールされるように、gem のインストールでネイティブ拡張機能のサポートを確認する (または試行して失敗する) 方法がわかりません。これを行う方法を調査したとき、主に数年前からの議論を見つけました。 Ruby gems が実際にはこの機能をサポートしていないことを示唆する pipermail/rubygems-developers/2007-November/003220.html 。最近は何もないので、SOの誰かが最新の知識を持っていることを願っていますか?
私の理想的な解決策は、拡張機能のビルドを試行する前に、対象の Ruby が C ネイティブ拡張機能をサポートしていない (または単にプロジェクト レベルでサポートしていない) ことを検出する方法です。しかし、あまり汚れていなければ、try/catch メカニズムも問題ありません。
これは可能ですか?それとも、検索時に見つけた2 つの gem バリアント (例:foo
と) を公開するというアドバイスは、まだ現在のベスト プラクティスですか?foo_ruby