问题标签 [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 中检索从 ruby 脚本传递的结构类型变量的结构成员?
我已经实现了 Ruby C 扩展(即从 ruby 脚本调用 C 函数) 以下是从文件“cFile.c”中用 c 实现的函数
以下是通过传递结构类型变量调用 functon() 方法的 ruby 脚本代码。客户端.rb:
谁能建议我如何在 cFunction() 中获取结构成员(即名称、地址等)?提前致谢
c - 在 C 中扩展 ruby - 如何指定默认参数值来运行?
我正在尝试为 ruby 编写一个 C 扩展来生成一个类。我正在研究如何为类定义一些默认参数。例如,如果我在 ruby 中有此类声明:
您可以使用 初始化它mc = MyClass.new("blah")
,并且年龄参数将在内部设置。我如何在 C 中做到这一点?到目前为止,我得到了这个,但这迫使进入另一个论点:
我考虑过检查age
againstQnil
或 using的值if ( TYPE(age) == T_UNDEF )
,但我只是从那里得到段错误。通读README.EXT
让我相信我可以通过rb_define_method
使用 的值来实现这一点argc
,但这并不太清楚。有任何想法吗?谢谢。
c - mkmf 在编译 C 扩展时忽略子文件夹中的文件
我想像这样组织 C 源代码:
我无法让此设置与mkmf
. native_extension/lib
中包含的文件native_extension.c
将被完全忽略。
当我构建扩展时,只native_extension.{h,c}
编译,我得到一个不完整native_extension.{so,dll}
的,当我尝试运行它时给我符号查找错误。
有什么办法可以使这项工作?
c++ - Ruby 扩展代码中的段错误
我正在用 C/C++ 编写一个小的 Ruby 扩展,它使 boost::dynamic_bitfield 在 Ruby 中可用。我的代码可以完美编译,但是在加载扩展并尝试实例化类时,我遇到了段错误。
我无法正确利用 gdb 来查找错误或错误发生的位置。我想我将问题缩小到Init_bitfield
or bf_new
/ bf_init
。
完整来源: http: //pastebin.com/qLkMGYqq
BitField 定义如下:
代码主要受这篇文章启发:http ://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html
c - Ruby C 扩展:同时运行一个事件循环
我正在实现一个简单的窗口库作为 Ruby C 扩展。Windows 有一种handle_events!
方法可以进入其本机事件循环。
问题是我想要每个窗口和方法块有一个事件循环。我希望该方法立即返回并让循环在单独的线程中运行。实现这一目标的最佳方法是什么?
我尝试使用rb_thread_call_without_gvl
来调用事件循环函数,然后使用rb_thread_call_with_gvl
来调用窗口的回调,即Proc
s. 完整的源代码可以在这里找到。
它仍然有效,但不是我想要的:该方法仍然阻塞。Ruby 的线程模型甚至可以做到这一点吗?
c - data_wrap_struct 和标记函数
我正在编写一个 Ruby 扩展并使用该函数Data_wrap_struct
。
为了参与 Ruby 的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用。我通过经典free
函数来释放内存,但我不知道如何使用标记函数。
我的结构听起来像这样
我认为我需要一个标记函数来标记collection
结构 B中的引用。
有人可以给我看一个例子来看看标记功能是如何工作的?
c - Ruby C 扩展中的构造函数的奇怪行为
我在 Ruby C 扩展中看到了类构造函数的奇怪行为。
看一个例子:我们有一个Foo
是 C 扩展的类和一个Bar
继承自的类Foo
:
extconf.rb
foo.c
bar.rb
好的,让我们看看奇怪的东西......
在这种情况下一切正常:
我们得到 2 个打印件:foo_new
和foo_init
.
好的,但是如果我们Bar
以这种方式更改课程:
如果我们跑步,我们会得到第一个奇怪的东西
我们只得到 1 个打印:foo_new
. 还有foo_init
??
好的,我们可以通过显式调用以下构造函数来绕过这个问题Foo
:
我们得到 2 个打印:foo_new
如果foo_init
我们调用x = Bar.new
.
第二个奇怪的东西是:如果我们调用
我们得到错误
但是构造函数Bar
接受一个具有默认值的参数。
为什么这个?这是一个 Ruby 错误吗?
(用 ruby1.9.3-p0 [ x86_64 ] 测试)
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
c - 如何在 Ruby 1.9 C 扩展中将 Block 转换为 Proc?
我正在编写一个 Ruby 1.9 C 扩展,我想在 ruby 中执行以下操作:
现在的问题是,在 C 方法上,我只“接收”一个块,据我所知,它甚至不是一个参数:我只能用 with 调用rb_yield
。
所以我的问题是:Ruby 1.9 C 扩展上有没有办法将块转换为 proc 或其他东西,所以我可以将它存储在我的模块中,并在以后需要时调用它?就像一个异步回调!
我已经用 Procs/lambdas 实现了这个,但是不直接使用块语法实在是太丑了。
c - 在 Ruby/Inline C 中接受未定义数量的参数
我正在尝试使用带有 Ruby 的内联 C 重写一个高度递归的函数。该函数接受未定义数量的参数,即在 Ruby 中它看起来像这样:
我正在尝试使用以下代码在 inline C 中模仿这一点:
但这会产生编译错误:
这是在 C 中完成此任务的正确方法吗?如果是这样,什么可能导致此错误?如果没有,它是如何完成的?