gpt4 book ai didi

c - Ruby 扩展 Data_Wrap_Struct - 类型错误

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

我正在尝试为一个库创建一个 C 包装器,并且我构建了这段代码,它似乎与网络上的大多数示例相匹配:

#include <stdio.h>
#include <stdlib.h>
#include "ruby.h"
#include "lpsolve/lp_lib.h"


VALUE klass;

void lp_free(lprec *lp) {
delete_lp(lp);
}

VALUE lp_create(VALUE self, VALUE cols) {
lprec *lp = make_lp(0, NUM2INT(cols));
if (lp == NULL) {
rb_raise(rb_eTypeError, "Could not allocate LP Structure");
}
return Data_Wrap_Struct(klass, NULL, lp_free, lp);
}


VALUE lp_add_column(VALUE self, VALUE data) {
lprec *lp;
Data_Get_Struct(self, lprec, lp);
return Qnil;
}

void Init_lpsolve_ruby() {
klass = rb_define_class("LPSolve", rb_cObject);
rb_define_method(klass, "lp_create", lp_create, 1);
rb_define_method(klass, "add_column", lp_add_column, 1);
}

接着是:

s = LPSolve.new
s.lp_create(5)
s.add_column(5)

但我最终遇到了这个错误:

test.rb:7:in `add_column': wrong argument type LPSolve (expected Data) (TypeError)

我在这里做错了什么?

谢谢。

最佳答案

您误解了Data_Wrap_StructData_Get_Struct 的功能。 Data_Wrap_Struct 分配一个包装数据的新对象。 Data_Get_Struct 的第一个参数必须是从 Data_Wrap_Struct 返回的对象。由于您没有为 LPSolve 定义自定义分配函数,因此当您调用 LPSolve.new 时,一个新的 LPSolve 实例会像任何其他正常情况一样进行分配ruby 中的对象(不调用 Data_Wrap_Struct),因此您不能将生成的对象传递给 Data_Get_Struct

关于c - Ruby 扩展 Data_Wrap_Struct - 类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32849092/

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