- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不确定我做错了什么。我有一个 Ruby 散列作为此函数的第三个参数传递,Test::test()
。
static VALUE nm_test(VALUE self, VALUE str, VALUE from, VALUE options) {
if (TYPE(options) != T_HASH) {
// raises error
}
if (rb_funcall(options, rb_intern("has_key?"), 1, rb_intern("dtype")) == Qtrue) { // SEGFAULT
// success
}
// other stuff
}
void Init_test() {
cTest = rb_define_module("Test");
rb_define_singleton_method(cTest, "test", nm_test, 3);
}
我听说如果您尝试调用某个对象上不存在的函数,您会遇到段错误。我还检查了对象是否响应 has_key?
:
if (TYPE(options) != T_HASH) {
rb_raise(rb_eArgError, "third argument to repack must be hash");
} else if (!rb_respond_to(options, rb_intern("has_key?"))) {
rb_raise(rb_eArgError, "hash does not respond to has_key?!");
}
这不会触发错误。所以它肯定是一个 Hash,而且肯定有 Hash#has_key?
。
这是实际代码(不是上面的代码)的实际回溯。段错误在 rb_funcall
行。
Program received signal SIGSEGV, Segmentation fault.
rb_type (obj=44840) at ./include/ruby/ruby.h:1344
1344 ./include/ruby/ruby.h: No such file or directory.
(gdb) bt
#0 rb_type (obj=44840) at ./include/ruby/ruby.h:1344
#1 rb_any_hash (a=44840) at hash.c:83
#2 0x080fc570 in st_lookup (table=0x8fa0470, key=44840, value=0x0) at st.c:341
#3 0x08066ef8 in rb_hash_has_key (hash=144171660, key=44840) at hash.c:1516
#4 0x08157f7d in vm_call0 (th=0x8265b88, recv=144171660, id=5127, argc=1, argv=0xbfffdf60, me=0x82ce480)
at vm_eval.c:79
#5 0x081587c4 in rb_call (scope=CALL_FCALL, argv=0xbfffdf60, argc=1, mid=5127, recv=144171660) at vm_eval.c:456
#6 rb_funcall (recv=144171660, mid=5127, n=1) at vm_eval.c:658
#7 0xb70933f8 in nm_rbstring_matlab_repack (self=142142600, str=144171680, from=12992526, options=144171660)
at ../../../../ext/nmatrix/util/io.cpp:210
有什么想法吗?
最佳答案
想通了。似乎 rb_intern("whatever!")
返回一个 ID
,而 rb_funcall 需要一个 VALUE
。所以对 rb_funcall
的调用应该如下所示:
rb_funcall(options, rb_intern("has_key?"), 1, ID2SYM(rb_intern("dtype")));
这很令人困惑,因为 :has_key?
成为一个 ID,并且工作得很好——但参数本身需要是 VALUE
类型。
关于c - 为什么我在使用 rb_funcall 调用 Hash#has_key 时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12098683/
我的扩展使用 Ruby 库通过接口(interface)发送和接收命令和遥测数据包,并将它们提供给 C 文件传输库进行处理。 收到大量数据包后,我会遇到此段错误。这是 GDB 的回溯。
我不确定我做错了什么。我有一个 Ruby 散列作为此函数的第三个参数传递,Test::test()。 static VALUE nm_test(VALUE self, VALUE str, VALUE
要从我的库中初始化一个类,我正在这样做: VALUE obj = rb_funcall(rb_path2class("MyGem::ClassName"), rb_in
我是一名优秀的程序员,十分优秀!