問題タブ [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 投票する
2 に答える
759 参照

c - ルビー配列の値をC配列に渡す

このレシピに基づいて、CでrubyのスタンドアロンFFT拡張機能を作成しようとしています

ルビーとcの間で異なる値を渡すためのいくつかの方法に注目しました。ただし、rubyとCの両方にかなり慣れていないため、VALUErubyオブジェクトからC配列に配列をコピーする方法を理解できません。

コンパイルエラー:SimpleFFT.c:47:エラー:添え字付きの値が配列でもポインターでもありません

そしてコード:

前もって感謝します :)

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

c - RubyのC拡張APIで「スタンドアロン」シンボルを取得する方法

C関数からいくつかの値を返したいのですが、IMHO、ハッシュは良いオプションです。私は最初rb_intern('A_KEY')にキーを作成していましたが、拡張機能がクラッシュしました。現在、を使用していますrb_str_new2が、記号が好きです。

新しいシンボルを作成し、クラスやメソッドを参照せずに使用するにはどうすればよいですか?

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

c - Ruby拡張リンクエラー

Ruby拡張機能をリンクしようとすると、このかなりあいまいなリンクエラーが発生し続けます。

これについては何も見つかりませんでした。しばらく実験しましたが、ヘッダーファイルを削除すると正常にリンクされたので、ヘッダーファイルなしで移動しました(はい、非常に悪い考えです)。

今、私はそれらが必要であることがわかりました。それで、このエラーは正確には何ですか、そしてどうすればそれを取り除くことができますか?

更新:すべてをクリアした後、私はこれらの警告を受け取り始めました:

これらは、私が最初に問題に遭遇したときにも現れました。それらが何を意味するのか正確にはわかりません。

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

c - リンク ターゲットを Ruby mkmf に追加するにはどうすればよいですか?

私の Ruby 拡張機能では、コードはディレクトリに編成されextconf.rb、メイン ライブラリ ファイルの間のツリーのルートに配置されます。

このセットアップの問題は、ディレクトリ内のすべてのファイルがライブラリに対してリンクされていないことです。mkmfそれらをまったく考慮していないようです。

でリンク ターゲットとして手動で追加するにはどうすればよいmkmfですか?

より良い質問は、私が使用できる Ruby 用のより柔軟なビルド システムはありますか? ということです。

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

c - Ruby 1.8.7:C拡張機能内で関数を呼び出す際のセグメンテーション違反

Rubyモジュール用の単純なC拡張機能を構築していますが、拡張機能内で別のC関数を呼び出すと、セグメンテーション違反で問題が発生します。実行の基本的なフローは次のようになります。

  1. Rubyクラスを作成し、そのクラスでインスタンスメソッドを呼び出します。
  2. 私の拡張機能でCメソッドを呼び出します。
  3. 別のファイルで別の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 --versioni686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)

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

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

どんな助けでも大歓迎です!

乾杯

0 投票する
3 に答える
875 参照

c - ac拡張機能を使用してrubyクラスを拡張するにはどうすればよいですか?

RubyでFoo::Barを記述していて、C拡張機能としてBarにメソッドを追加したい場合。今、CでFoo :: Barを次のように作成すると、次のようになります。

しかし、問題は次のとおりです。

したがって、基本的に元のFoo::Barを上書きしています。上書きせずに拡張するにはどうすればよいですか?

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

c - c 拡張機能から ruby​​ 配列にアクセスするにはどうすればよいですか?

このエラーが発生しています

この行の

このコードでは

self の使い方が間違っていますか? rb_ivar_get は実際には PairCounter クラスを指していませんか?

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

c - ruby 配列から c エクステンションにプルしている値が間違っているのはなぜですか?

このメソッドは、Ruby 配列の要素を正しく表示できることを確認しているだけです。

しかし、メソッドを使用すると、配列の要素が間違っています。奇妙なことに、出力される数値のサイズは ruby​​ 配列の数値のサイズとほぼ一致するため、ある種のアドレス情報を取得しているようには見えません。新しいオブジェクトを作成して print_cards を実行するたびに、数値も一貫しています。

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

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 は、ガベージ コレクターから呼び出されます。