В настоящее время я использую Ruby C API и у меня возникают проблемы с определением глобальных переменных Ruby.
Значения Ruby хранятся в C как VALUE или unsigned long
. Я использую версию Ruby v2.6.0p0, и я пытался использовать макросы, такие как INT2NUM (), DBL2NUM () и INT2FIX (), и введенное число всегда сохраняется следующим образом:
значение * 2 + 1 - если это целое число
значение * 2 - если это число с плавающей запятой / double
Вот что у меня есть:
#include <Ruby/ruby.h>
int main() {
ruby_init();
/* Test with no Ruby variables, just to see what it outputs
using INT2NUM() */
VALUE x = INT2NUM(3);
printf("%lu", x);
/* Test storing y in a Ruby variable, then calling it using
INT2FIX() */
VALUE y = INT2FIX(4.5);
rb_gv_set("$y", y);
printf("%lu", rb_gv_get("$y"));
/* Test storing z in a Ruby variable then calling it using
DBL2NUM() */
VALUE z = DBL2NUM(6);
rb_gv_set("$z", z);
printf("%lu", rb_gv_get("$z"));
ruby_cleanup(0);
return 0;
}
Для первого теста вывод должен быть 3
, но он выводится как 7
, а для второго теста вывод должен быть 4.5
, но выводится как 9
. Последний тест должен быть напечатан как 6
, но он напечатан как 54043195528445954
, предположительно, адрес, где он хранится.