我正在尝试为库创建一个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)
我在这里做错了什么?
感谢。
答案 0 :(得分:2)
您误解了Data_Wrap_Struct
和Data_Get_Struct
的功能。 Data_Wrap_Struct
分配一个包装数据的新对象。 Data_Get_Struct
的第一个参数必须是从Data_Wrap_Struct
返回的对象。由于您没有为LPSolve
定义自定义分配函数,因此当您调用LPSolve.new
时,会像ruby中的任何其他普通对象一样分配LPSolve
的新实例(不调用Data_Wrap_Struct
),因此您无法将生成的对象传递给Data_Get_Struct
。