编译Ruby内联C代码-解决错误

编译Ruby内联C代码-解决错误,ruby,inline-code,Ruby,Inline Code,我正在尝试让这个Ruby内联C代码正常工作。代码在香草C中工作,但在这里我得到了错误和警告。是什么导致了这个错误 ./backtrack_inline.rb:67: error: lvalue required as unary '&' operand 还有,为什么会出现以下错误 ./backtrack_inline.rb:73: error: too few arguments to function 'backtrack' 检查生成的C代码()时,我没有发现参数有任何错误。但我也

我正在尝试让这个Ruby内联C代码正常工作。代码在香草C中工作,但在这里我得到了错误和警告。是什么导致了这个错误

./backtrack_inline.rb:67: error: lvalue required as unary '&' operand
还有,为什么会出现以下错误

./backtrack_inline.rb:73: error: too few arguments to function 'backtrack'
检查生成的C代码()时,我没有发现参数有任何错误。但我也收到了以下警告:

./backtrack_inline.rb:73: warning: passing argument 1 of 'backtrack' makes integer from pointer without a cast
./backtrack_inline.rb:73: warning: passing argument 2 of 'backtrack' makes integer from pointer without a cast
./backtrack_inline.rb:73: warning: passing argument 3 of 'backtrack' makes integer from pointer without a cast

好的。。。对此再多考虑一下

您正在调用变量端。虽然这在C语言中不是一个保留字,但ruby不应该看到它。。。也许是ruby弄糊涂了

我建议你试着给它改名,以防万一。即使只是排除它也是值得的。

从以下几点开始:

./backtrack_inline.rb:73: error: too few arguments to function 'backtrack'
如果查看生成的代码,
回溯
功能定义在第29行:

static VALUE backtrack(VALUE self, VALUE _ss, VALUE _s, VALUE _p, VALUE _mm, VALUE _ins, VALUE _del) { ... }
它有七个参数,最初的六个,加上
VALUE self
,因为它已转换为
Scan
类上的方法

第67行对此函数的调用如下所示:

end = backtrack(ss, s, p, mm, ins, del);
它只有六个论点。RubyLine不会将其转换为对对象上的方法的调用,它只是逐字复制它。这也是关于
不带强制转换的指针生成整数的警告的来源:函数定义已转换为take
VALUE
s,但您使用的是原始类型

错误消息表示错误来自
backtrack_inline.rb
中的第73行,因为生成代码的第54行上有指令:

# line 61 "./backtrack_inline.rb"
这基本上告诉编译器“重置”其行和文件值以查找错误,并将下一行(55)视为文件
/backtrack\u inline.rb
中的第61行。实际行是67,比55早12行,但是编译器报告它是73,比61早12行(它被重置为的值),并且来自不同的文件。在这种情况下,这种技术实际上不起作用,因为它没有考虑rubynline添加的额外行。源中的实际行是69

一个简单的解决方法是将
回溯
函数的定义更改为C函数,而不是将其作为对象上的方法添加。将
builder.c
更改为
builder.prefix
(在Ruby文件的第38行)。如果您希望在Ruby中的对象上有
回溯
方法,那么这将不起作用。如果是这种情况,您可能需要创建另一个函数作为方法,然后将“真实”回溯函数包装起来

接下来,看看

./backtrack_inline.rb:67: error: lvalue required as unary '&' operand
这实际上是指生成代码的第61行,它看起来像:

char* s = StringValuePtr(rb_iv_get(self, "@seq"));
StringValuePtr
是一个:

这就是一元操作数所需的
左值中的
&
的来源。您需要添加一个局部变量作为左值:

VALUE seq = rb_iv_get(self, "@seq");
char* s = StringValuePtr(seq);
在我的例子中(Mac OS X Snow Leopard、Ruby 1.9.3-p0、RubyLine 3.11.0),这两个更改使脚本运行时没有错误,但给出了警告:

backtrack_inline.rb:47: warning: implicit conversion shortens 64-bit value into a 32-bit value
这实际上是指ruby文件的第46行:

return (s - ss) - 1;
s
ss
char*
,即64位指针(在本机上),函数的返回类型为
int
-32位。添加显式强制转换修复了以下问题:

return (int)((s - ss) - 1);
它现在运行得很干净:

ruby-inline $ ruby backtrack_inline.rb 
14
ruby-inline $ 
(我希望14是正确答案!)


这是一个。

好的,这个问题在Ruby论坛上也得到了回答:


它在试验时破坏了我的ruby安装:)
ruby-inline $ ruby backtrack_inline.rb 
14
ruby-inline $