gpt4 book ai didi

c - 我在这个 C 扩展中引用实例的方式有问题吗?

转载 作者:行者123 更新时间:2023-11-30 18:05:20 25 4
gpt4 key购买 nike

我遇到了一些问题,如果我在 Rails 环境之外运行这个 C 扩展,它可以工作,但是当我在 Rails 内部运行时,它会给我一个堆栈转储。

我收到此错误消息:

NoMethodError Exception: undefined method `evaluate' for #<String:0x00000103557db0>

这可能是指我在 EV::Counters 评估函数中进行的调用,以及我正在调用的三个实例中存在的“评估”函数。

奇怪的是 valgrind 没有给我任何错误。但我认为我引用实例的方式可能做错了一些基本的事情?

VALUE rFlushInstance, rPairCounterInstance, rStraightInstance;


static VALUE
evaluate(VALUE self, VALUE val, VALUE suit, VALUE index)
{
rb_funcall(rFlushInstance, rb_intern("evaluate"), 3, val, suit, index);
rb_funcall(rStraightInstance, rb_intern("evaluate"), 2, val, index);
rb_funcall(rPairCounterInstance, rb_intern("evaluate"), 2, val, index);

return Qnil;
}

VALUE EV;

void Init_counters()
{
EV = rb_define_module("EV");
VALUE Counters = rb_define_class_under(EV, "Counters", rb_cObject);
init_pair_counter();
init_straight();
init_flush();

VALUE Flush = rb_const_get(EV, rb_intern("Flush"));
VALUE PairCounter = rb_const_get(EV, rb_intern("PairCounter"));
VALUE Straight = rb_const_get(EV, rb_intern("Straight"));
rFlushInstance = rb_class_new_instance(0, NULL, Flush);
rStraightInstance = rb_class_new_instance(0, NULL, Straight);
rPairCounterInstance = rb_class_new_instance(0, NULL, PairCounter);

rb_define_method(Counters, "initialize", initialize_counters, 2);
rb_define_method(Counters, "evaluate", evaluate, 3);

}

最佳答案

我需要做的是将实例存储为实例变量,例如:

VALUE rPairCounterInstance = rb_class_new_instance(0, NULL, PairCounter);   
rb_ivar_set(self, rb_intern("@pair"), rPairCounterInstance);

关于c - 我在这个 C 扩展中引用实例的方式有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6574754/

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