Макросы API Ruby C, такие как INT2NUM (), возвращают / сохраняют числа, отличные от ожидаемых - PullRequest
0 голосов
/ 15 января 2019

В настоящее время я использую 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, предположительно, адрес, где он хранится.

...