gpt4 book ai didi

c - 内联代码导致 ruby​​ 解释器崩溃

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:01 25 4
gpt4 key购买 nike

我基于 ruby​​ 的数据分析项目需要高性能。我计划创建一个内联 C 函数来读取一段数据并更新一些全局变量,我可以在 ruby​​ 中进行更多处理。

以下玩具代码:

require 'inline'
class Foo
inline :C do |builder|
builder.c_raw_singleton <<SRC
static char *cstr = "hi you'all, welcome";
void write_global(VALUE self, VALUE *name){
rb_gv_set(rb_string_value_cstr(name), rb_str_new_cstr(cstr));
cstr[1] ++;
}
SRC
end
end


$bar = ""
Foo.write_global('bar') #=> 1
puts $bar;
Foo.write_global('bar') #=> 1
puts $bar;

会导致 ruby​​ 解释器异常。

请问是什么问题

更新 1

感谢@mu-is-too-short 指出常量字符串不能被修改,我把它改成一个缓冲区(见下文),但编译错误如

WARNING: '&cstr[0]' not understood
WARNING: '"%s"' not understood
WARNING: '"hi you'all' not understood
WARNING: 'welcome"' not understood
WARNING: Can't find signature in "\t static char cstr[20];static int f(&cstr[0], \"%s\", \"hi you'all, welcome\");\n void write_global(VALUE self, VALUE *name){\n rb_gv_set(rb_string_value_cstr(name), rb_str_new_cstr(cstr));\n\t\tcstr[1] ++;\n }\n"
inline1a.rb:5:37: error: expected declaration specifiers or ‘...’ before ‘&’ token
builder.c_raw_singleton <<SRC

这里是新代码,它不会尝试修改常量字符串。

require 'inline'
class Foo
inline :C do |builder|
builder.c_raw_singleton <<SRC
static char cstr[20];
sprintf(&cstr[0], "%s", "hi you'all, welcome");
void write_global(VALUE self, VALUE *name){
rb_gv_set(rb_string_value_cstr(name), rb_str_new_cstr(cstr));
cstr[1] ++;
}
SRC
end
end


$bar = ""
Foo.write_global('bar') #=> 1
puts $bar;
Foo.write_global('bar') #=> 1
puts $bar;

最佳答案

你的问题是你试图修改只读内存。如果你把所有的杂乱都弄清楚了,你可以用一个小的 C 程序来展示它:

int
main(int argc, char **argv) {
char *cstr = "hi you'all, welcome";
cstr[1]++;
return 0;
}

如果你编译并运行它,你应该会得到一个总线错误(或类似错误),因为 cstr 在只读内存中而 cstr[1]++ 是试图修改那个只读存储器。在 Is it possible to modify a string of char in C? 中对此进行了一些讨论。 中可能还有数百个其他问题标签。

解决方法是不修改cstr。我没有足够的细节来提供更具体的建议。

关于c - 内联代码导致 ruby​​ 解释器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com