gpt4 book ai didi

c - 嵌入 C 代码的 Ruby 解释器

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:52 24 4
gpt4 key购买 nike

我只是尝试了书中的一个简单示例:我有一个 sum.rb 文件:

class Summer
def sum(max)
raise "Invalid maximum #{max}" if max < 0
(max*max + max)/2
end
end

还有一个 embed_sum.c 文件:

#include <stdio.h>
#include <ruby/ruby.h>
int main ( int argc, char ** argv)
{
VALUE result;
ruby_sysinit(&argc, &argv);
RUBY_INIT_STACK;
ruby_init();
ruby_init_loadpath();
rb_require("sum");
rb_eval_string("$summer = Summer.new");
rb_eval_string("$result = $summer.sum(10)");
result = rb_gv_get("result");
printf("Result = %d\n", NUM2INT(result));
return ruby_cleanup(0);
}

我用它编译:

gcc -Wall -lruby -I/usr/include/ruby-1.9.1/  embed_sum.c -o embed_sum

当我启动 ./embed_sum 时,它从第一个 rb_eval_string 给我一个段错误。我的 ruby​​ 版本是:Archlinux 上的 ruby​​ 1.9.3p125(2012-02-16 修订版 34643)[x86_64-linux]。

这个例子可能有什么问题?

最佳答案

对您的问题的简短回答是将 rb_require("sum"); 行更改为 rb_require("./sum");。这是 Ruby 1.9.2 中引入的更改,其中当前目录不再位于加载路径上。

更普遍的问题是嵌入式 Ruby 处理异常的方式。 Pickaxe 书(我认为是您正在使用的书,它使用了类似的示例)是这样说的:

If the Ruby code raises an exception and it isn't caught, your C program will terminate. To overcome this, you need to do what the interpreter does and protect all calls that could raise an exception. This can get messy.

您需要考虑使用 rb_protect 函数来包装对可能导致异常的 Ruby 调用。 Pickaxe 书中有一个这样的例子。

关于c - 嵌入 C 代码的 Ruby 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618957/

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