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才会有这种情况。

顺便附一份代码
C 代码复制
  1. /*
  2. 环境:Win10
  3. 编译器:VS2019
  4. */
  5.  
  6. #include <ruby/ruby.h>
  7.  
  8. int main(int argc, char* argv[])
  9. {
  10.     ruby_sysinit(&argc, &argv);
  11.     RUBY_INIT_STACK;
  12.     ruby_init();
  13.     ruby_script("ruby-interact");
  14.     ruby_init_loadpath();
  15.  
  16.     rb_eval_string("p Math.sqrt(10.0)");
  17.     rb_eval_string("p Marshal.dump([0, 1, 2, 3, 4])");
  18.     rb_eval_string("p Time.now()"); // Program crashes here.
  19.  
  20.     ruby_finalize();
  21.     return 0;
  22. }

作者: 哇哇哇啊叭叭    时间: 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! X3.1