問題タブ [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 - ルビー配列の値をC配列に渡す
このレシピに基づいて、CでrubyのスタンドアロンFFT拡張機能を作成しようとしています
ルビーとcの間で異なる値を渡すためのいくつかの方法に注目しました。ただし、rubyとCの両方にかなり慣れていないため、VALUErubyオブジェクトからC配列に配列をコピーする方法を理解できません。
コンパイルエラー:SimpleFFT.c:47:エラー:添え字付きの値が配列でもポインターでもありません
そしてコード:
前もって感謝します :)
c - RubyのC拡張APIで「スタンドアロン」シンボルを取得する方法
C関数からいくつかの値を返したいのですが、IMHO、ハッシュは良いオプションです。私は最初rb_intern('A_KEY')
にキーを作成していましたが、拡張機能がクラッシュしました。現在、を使用していますrb_str_new2
が、記号が好きです。
新しいシンボルを作成し、クラスやメソッドを参照せずに使用するにはどうすればよいですか?
c - Ruby拡張リンクエラー
Ruby拡張機能をリンクしようとすると、このかなりあいまいなリンクエラーが発生し続けます。
これについては何も見つかりませんでした。しばらく実験しましたが、ヘッダーファイルを削除すると正常にリンクされたので、ヘッダーファイルなしで移動しました(はい、非常に悪い考えです)。
今、私はそれらが必要であることがわかりました。それで、このエラーは正確には何ですか、そしてどうすればそれを取り除くことができますか?
更新:すべてをクリアした後、私はこれらの警告を受け取り始めました:
これらは、私が最初に問題に遭遇したときにも現れました。それらが何を意味するのか正確にはわかりません。
c - リンク ターゲットを Ruby mkmf に追加するにはどうすればよいですか?
私の Ruby 拡張機能では、コードはディレクトリに編成されextconf.rb
、メイン ライブラリ ファイルの間のツリーのルートに配置されます。
このセットアップの問題は、ディレクトリ内のすべてのファイルがライブラリに対してリンクされていないことです。mkmf
それらをまったく考慮していないようです。
でリンク ターゲットとして手動で追加するにはどうすればよいmkmf
ですか?
より良い質問は、私が使用できる Ruby 用のより柔軟なビルド システムはありますか? ということです。
c - Ruby 1.8.7:C拡張機能内で関数を呼び出す際のセグメンテーション違反
Rubyモジュール用の単純なC拡張機能を構築していますが、拡張機能内で別のC関数を呼び出すと、セグメンテーション違反で問題が発生します。実行の基本的なフローは次のようになります。
- Rubyクラスを作成し、そのクラスでインスタンスメソッドを呼び出します。
- 私の拡張機能でCメソッドを呼び出します。
- 別のファイルで別のC関数を呼び出しますが、コンパイルはOKです
壊れそうな最後のジャンプです。関数呼び出し以外の機能はほとんどなく、問題を再現することができました。私は標準を持っていて、extconf.rb
まっすぐなMakeでコンパイルすると、への呼び出しでsegfaultされencrypt()
ます。実行時に、次のコマンドを発行します。
出力:
Rubyクラス:
Calcモジュール:
cryptlib.h:
cryptlib.c:
なぜこれがひどく壊れているのですか?ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10]
1時間以内にMacPortsからコンパイルされたMacBookProで実行しています。私のgcc --version
:
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
c - C Ruby 拡張機能での curl/libcurl の使用
序文: 私は C に非常に慣れていないので、明らかな何かが欠けている可能性がありますが、それが何であるかを理解しようとして何日も走り回っています...
Mac と PC の両方で動作し、libcurl を使用してファイルをダウンロードする Ruby C 拡張機能を作成しようとしています。
基本的に、このツールが行うことは、Ruby からファイルのリストを取得し、ファイルをダウンロードして、Ruby が指定した場所に配置することだけです。
Ruby 内から機能する拡張機能があり、Ruby とのインターフェイスとなる C 拡張機能をコンパイルしました。
基本的に、私のコードは次のようになります。
私が問題を抱えているのは、libcurlを実際に機能させることです:
Ruby を使用mkmf
して、拡張機能の Makefile を作成しています。
拡張機能をコンパイルするときに Makefile がその Curl ファイルを見つけることができないと想定していますが、私は C/Ruby 拡張機能を初めて使用するため、その理由がわかりません。
これを実行するcurl-config --cflags
と、次のようになります。
私のlibcurlインクルード/ライブラリファイルは次のとおりです。
私のセットアップ:
- Mac OS X 10.6.4
- ルビー 1.8.6-p420
- カール 7.21.7-DEV (i386-apple-darwin10.7.0) libcurl/7.21.7-DEV OpenSSL/0.9.8l zlib/1.2.3
どんな助けでも大歓迎です!
乾杯
c - ac拡張機能を使用してrubyクラスを拡張するにはどうすればよいですか?
RubyでFoo::Barを記述していて、C拡張機能としてBarにメソッドを追加したい場合。今、CでFoo :: Barを次のように作成すると、次のようになります。
しかし、問題は次のとおりです。
したがって、基本的に元のFoo::Barを上書きしています。上書きせずに拡張するにはどうすればよいですか?
c - c 拡張機能から ruby 配列にアクセスするにはどうすればよいですか?
このエラーが発生しています
この行の
このコードでは
self の使い方が間違っていますか? rb_ivar_get は実際には PairCounter クラスを指していませんか?
c - ruby 配列から c エクステンションにプルしている値が間違っているのはなぜですか?
このメソッドは、Ruby 配列の要素を正しく表示できることを確認しているだけです。
しかし、メソッドを使用すると、配列の要素が間違っています。奇妙なことに、出力される数値のサイズは ruby 配列の数値のサイズとほぼ一致するため、ある種のアドレス情報を取得しているようには見えません。新しいオブジェクトを作成して print_cards を実行するたびに、数値も一貫しています。
c - Data_Wrap_Struct のクラスとして何を返す必要がありますか?
これは、私の問題を切り分けるコードです。
Ruby で get_pairs_2 を呼び出すと、次のエラーが発生します。
C が EV::PairCounter を文字列などではなく、スーパークラスとして表示していることを確認しました。
ちなみに、これは C 拡張 API が Data_Wrap_Struct について言っていることです。
C データを Ruby オブジェクトにカプセル化する
C ポインターを Ruby オブジェクト (いわゆる DATA) としてラップしてオブジェクト化するには、Data_Wrap_Struct() を使用します。
Data_Wrap_Struct() は、作成された DATA オブジェクトを返します。klass 引数は、DATA オブジェクトのクラスです。mark 引数は、このデータが指す Ruby オブジェクトをマークする関数です。free 引数は、ポインタの割り当てを解放する関数です。これが -1 の場合、ポインターは単に解放されます。関数 mark と free は、ガベージ コレクターから呼び出されます。