gpt4 book ai didi

c - 如何使用 RubyInline 将字符串加载到 C 方法中

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

我想在 Ruby 中使用 C 方法来处理字符串。我在这里找到了一个先前的问题,部分回答了这个问题。我用这个要点开始了我的尝试:https://gist.github.com/dimus/147023 .它首先尝试将 ruby​​ 字符串强制转换为 C 整数数组。

这是我目前所拥有的:

#!/usr/bin/env ruby

require 'inline'

class TestC
inline do |builder|

builder.c "
static
void
load_string(VALUE _s) {
VALUE *sv = RARRAY_PTR(_s);
int sl = RARRAY_LEN(_s);
int s[sl];
int i;
for (i=0; i < sl; i++) {
s[i] = NUM2INT(sv[i]);
}
}
"
end

def run_inline
load_string("string")
end

end

test = TestC.new

test.run_inline

不幸的是,for 循环中的那行代码导致了代码段错误。

最近有人用过 RubyInline 吗?我正在使用 Ruby 2.0.0p451。

干杯,

最佳答案

在您的 C 代码中调用 VALUE *sv = RARRAY_PTR(_s);,因此您将参数视为 Ruby 数组,但您使用 load_string("string")——即你传递一个字符串。因此,您获得的指针是无效的,当您尝试使用它时,您会遇到段错误。

如果您传入一个数组(例如 load_string(["string"]),您将修复段错误,但这将生成不会将 String 隐式转换为 Integer (TypeError) 当您尝试在字符串上使用 NUM2INT 时。

您需要确保检查方法的参数类型,并在类型不是您预期的情况下进行处理。

关于c - 如何使用 RubyInline 将字符串加载到 C 方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23020274/

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