Project1

标题: 请教C/C++与Ruby交互内部类为空该怎么解决呢? [打印本页]

作者: myownroc    时间: 2022-11-25 16:15
标题: 请教C/C++与Ruby交互内部类为空该怎么解决呢?
本帖最后由 myownroc 于 2022-11-25 16:49 编辑

工作摸鱼想弄个类似RPG Maker的Ruby引擎。

各种交互都挺好的,结果发现在调用诸如Time.now这样的Ruby内建类的函数时发现程序会崩溃。

跟进去一看应该是找不到Time这样的内建类,导致操作空指针使程序崩溃,而内建的模块比如Math就不存在这种问题。于是我现在就很迷惑RPG Maker中是怎么能够调用Ruby内建类的……

找了一下ruby.h貌似并没有相关的接口提供,文档更是少之又少(版本还很旧),于是上论坛上请教大伙看看有没有人知道的~

坏了,好像Windows下编译的Ruby才会有这种情况。

顺便附一份代码
[pre lang="C"]
/*
环境:Win10
编译器:VS2019
*/

#include <ruby/ruby.h>

int main(int argc, char* argv[])
{
    ruby_sysinit(&argc, &argv);
    RUBY_INIT_STACK;
    ruby_init();
    ruby_script("ruby-interact");
    ruby_init_loadpath();

    rb_eval_string("p Math.sqrt(10.0)");
    rb_eval_string("p Marshal.dump([0, 1, 2, 3, 4])");
    rb_eval_string("p Time.now()"); // Program crashes here.

    ruby_finalize();
    return 0;
}
[/pre]
作者: 哇哇哇啊叭叭    时间: 2022-11-27 11:00

  这种问题已经可以发在csdn和github上问了吧!?





作者: guoxiaomi    时间: 2022-11-27 23:00
本帖最后由 guoxiaomi 于 2022-11-28 00:45 编辑

看了一下我写的代码,还有一个rb_call_builtin_inits没调用:
  1. /** @brief 初始化 ruby 运行环境 */
  2.     explicit ruby_library() : ruby_state(0)
  3.     {
  4.         int argc = 0;
  5.         char* argv = nullptr;
  6.         char** pArgv = &argv;

  7.         ruby_sysinit(&argc, &pArgv);
  8.         RUBY_INIT_STACK;
  9.         ruby_init();
  10.         ruby_init_loadpath();
  11.         rb_call_builtin_inits();
  12.     }
复制代码


可以参照一下我这个帖子的18楼的源码:https://rpg.blue/thread-488007-1-1.html




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X5.0