- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试为一个库创建一个 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_Struct
和Data_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/
我正在为物理引擎编写一个 Ruby 扩展。此物理引擎具有链接到世界 的body,因此我的Ruby 对象是World 和Body。主体是使用 world->CreateBody 构建(在 C++ 中)并
我正在编写一个 Ruby 扩展,我正在使用函数 Data_wrap_struct。 为了参与 Ruby 的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结
这是我的精简代码,它隔离了我的问题: #include "ruby.h" #include "stdlib.h" typedef struct HandValues { double pair
我在 Ruby C 扩展中包装了一个 C 结构,但我在文档中找不到 Data_Wrap_Struct 和 TypedData_Wrap_Struct 之间的区别,这两个函数之间有什么区别? 最佳答案
我正在尝试为一个库创建一个 C 包装器,并且我构建了这段代码,它似乎与网络上的大多数示例相匹配: #include #include #include "ruby.h" #include "lps
rb_iv_get 和 rb_iv_set 对比。 Data_Wrap_Struct 用于自定义类 因此,在阅读 Ruby 扩展 API 时,我发现 Data_Wrap_Struct 可以将指针转换为
我是一名优秀的程序员,十分优秀!