Ruby Extension Data_Wrap_Struct - 类型错误

时间:2015-09-29 16:22:34

标签: c ruby

我正在尝试为库创建一个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)

我在这里做错了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

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