问题标签 [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 投票
1 回答
183 浏览

c - 如何在 C 中检索从 ruby​​ 脚本传递的结构类型变量的结构成员?

我已经实现了 Ruby C 扩展(即从 ruby​​ 脚本调用 C 函数) 以下是从文件“cFile.c”中用 c 实现的函数

以下是通过传递结构类型变量调用 functon() 方法的 ruby​​ 脚本代码。客户端.rb:

谁能建议我如何在 cFunction() 中获取结构成员(即名称、地址等)?提前致谢

0 投票
2 回答
3759 浏览

c - 在 C 中扩展 ruby​​ - 如何指定默认参数值来运行?

我正在尝试为 ruby​​ 编写一个 C 扩展来生成一个类。我正在研究如何为类定义一些默认参数。例如,如果我在 ruby​​ 中有此类声明:

您可以使用 初始化它mc = MyClass.new("blah"),并且年龄参数将在内部设置。我如何在 C 中做到这一点?到目前为止,我得到了这个,但这迫使进入另一个论点:

我考虑过检查ageagainstQnil或 using的值if ( TYPE(age) == T_UNDEF ),但我只是从那里得到段错误。通读README.EXT让我相信我可以通过rb_define_method使用 的值来实现这一点argc,但这并不太清楚。有任何想法吗?谢谢。

0 投票
2 回答
773 浏览

c - mkmf 在编译 C 扩展时忽略子文件夹中的文件

我想像这样组织 C 源代码:

我无法让此设置与mkmf. native_extension/lib中包含的文件native_extension.c将被完全忽略。

当我构建扩展时,只native_extension.{h,c}编译,我得到一个不完整native_extension.{so,dll}的,当我尝试运行它时给我符号查找错误。

有什么办法可以使这项工作?

0 投票
1 回答
146 浏览

c++ - Ruby 扩展代码中的段错误

我正在用 C/C++ 编写一个小的 Ruby 扩展,它使 boost::dynamic_bitfield 在 Ruby 中可用。我的代码可以完美编译,但是在加载扩展并尝试实例化类时,我遇到了段错误。

我无法正确利用 gdb 来查找错误或错误发生的位置。我想我将问题缩小到Init_bitfieldor bf_new/ bf_init

完整来源: http: //pastebin.com/qLkMGYqq

BitField 定义如下:

代码主要受这篇文章启发:http ://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html

0 投票
2 回答
764 浏览

c - Ruby C 扩展:同时运行一个事件循环

我正在实现一个简单的窗口库作为 Ruby C 扩展。Windows 有一种handle_events!方法可以进入其本机事件循环。

问题是我想要每个窗口和方法块有一个事件循环。我希望该方法立即返回并让循环在单独的线程中运行。实现这一目标的最佳方法是什么?

我尝试使用rb_thread_call_without_gvl来调用事件循环函数,然后使用rb_thread_call_with_gvl来调用窗口的回调,即Procs. 完整的源代码可以在这里找到。

它仍然有效,但不是我想要的:该方法仍然阻塞。Ruby 的线程模型甚至可以做到这一点吗?

0 投票
1 回答
571 浏览

c - data_wrap_struct 和标记函数

我正在编写一个 Ruby 扩展并使用该函数Data_wrap_struct

为了参与 Ruby 的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用。我通过经典free函数来释放内存,但我不知道如何使用标记函数。

我的结构听起来像这样

我认为我需要一个标记函数来标记collection结构 B中的引用。

有人可以给我看一个例子来看看标记功能是如何工作的?

0 投票
1 回答
272 浏览

c - Ruby C 扩展中的构造函数的奇怪行为

我在 Ruby C 扩展中看到了类构造函数的奇怪行为。
看一个例子:我们有一个Foo是 C 扩展的类和一个Bar继承自的类Foo

extconf.rb

foo.c

bar.rb

好的,让我们看看奇怪的东西......
在这种情况下一切正常:

我们得到 2 个打印件:foo_newfoo_init.
好的,但是如果我们Bar以这种方式更改课程:

如果我们跑步,我们会得到第一个奇怪的东西

我们只得到 1 个打印:foo_new. 还有foo_init??
好的,我们可以通过显式调用以下构造函数来绕过这个问题Foo

我们得到 2 个打印:foo_new如果foo_init我们调用x = Bar.new.

第二个奇怪的东西是:如果我们调用

我们得到错误

但是构造函数Bar接受一个具有默认值的参数。
为什么这个?这是一个 Ruby 错误吗?

(用 ruby​​1.9.3-p0 [ x86_64 ] 测试)

0 投票
1 回答
3855 浏览

ruby - 红宝石 extconf.rb 示例

我正在按照http://people.apache.org/~rooneg/talks/ruby-extensions/ruby-extensions.html(第 6 页)的说明进行操作,并且我的 make 命令只返回make: Nothing to be done for 'all'.

有没有人有任何想法?

我正在使用 ruby​​ 1.9.2,我在 OSX 10.6.8

0 投票
1 回答
736 浏览

c - 如何在 Ruby 1.9 C 扩展中将 Block 转换为 Proc?

我正在编写一个 Ruby 1.9 C 扩展,我想在 ruby​​ 中执行以下操作:

现在的问题是,在 C 方法上,我只“接收”一个块,据我所知,它甚至不是一个参数:我只能用 with 调用rb_yield

所以我的问题是:Ruby 1.9 C 扩展上有没有办法将块转换为 proc 或其他东西,所以我可以将它存储在我的模块中,并在以后需要时调用它?就像一个异步回调!

我已经用 Procs/lambdas 实现了这个,但是不直接使用块语法实在是太丑了。

0 投票
2 回答
431 浏览

c - 在 Ruby/Inline C 中接受未定义数量的参数

我正在尝试使用带有 Ruby 的内联 C 重写一个高度递归的函数。该函数接受未定义数量的参数,即在 Ruby 中它看起来像这样:

我正在尝试使用以下代码在 inline C 中模仿这一点:

但这会产生编译错误:

这是在 C 中完成此任务的正确方法吗?如果是这样,什么可能导致此错误?如果没有,它是如何完成的?