Ruby 初学 mruby,不知道这是什么问题,有没有人可以帮忙解决一下啊!

ohmygod · 2013年12月10日 · 最后由 skandhas 回复于 2013年12月10日 · 3226 次阅读
#include <stdlib.h>
#include <stdio.h>

/* Include the mruby headers */
#include <mruby.h>
#include <mruby/proc.h>
#include <mruby/data.h>
#include <mruby/compile.h>
mrb_value my_func(mrb_state *mrb,mrb_value self);
void main(void)
{
    mrb_state *mrb = mrb_open();
    mrb_define_method(mrb,mrb->object_class,"func",my_func,ARGS_NONE());

    FILE *fp=fopen("/home/hjj/mruby/bin/p.mrb","rb");
    mrb_int n = mrb_load_irep(mrb,fp);

    mrb_run(mrb, mrb_proc_new(mrb,mrb->irep[n]), mrb_top_self(mrb));    
}

mrb_value my_func(mrb_state *mrb,mrb_value self)
{
  return mrb_fixnum_value(111);
}

本人初学 mruby,不知道这是什么问题,有没有人可以帮忙解决一下啊!谢谢~~~~

在 mruby 里加载一个 mrb 字节码文件并执行,可以使用函数 (mrb_load_irep_file_cxt):

mrb_value  mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c);

你可以看看它的实现,它主要分 3 步:

  1. 通过 mrb_read_irep_file 加载字节码文件。
  2. 创建要执行的 proc。
  3. 通过 mrb_context_run 来执行。

所以你也可以根据你的需要,写自己的加载执行函数。

#1 楼 @skandhas 请问一下,这个函数是哪个头文件里的呢?我没有找到这个函数。。 mruby 的资料这么少,不知道您是怎么学的呢,我刚开始学,感觉很吃力。

#2 楼 @ohmygod 这个函数的声明在 dump.h 中。还有其他一些 load irep 的函数你可以一起看看。 mruby 本身的代码就是很好的教材。另外,@matz 也要出关于 mruby 的电子书,这个应该是很期待的。;)

#3 楼 @skandhas 那我要认真看各种头文件了。我也很期待《关于 mruby 的一切》能够赶快上市。

int n = mrb_load_irep_file(mrb,fp);
printf("%d\n",n);

我把代码替换成这个之后,编译没有问题了,只是运行可执行文件时出现“段错误(核心已转储)”。这是怎么回事呢?

#4 楼 @ohmygod mrb_load_irep_file 返回的是 mrb_value. 你确定看过 dump.h 的函数声明吗 ;)

#5 楼 @skandhas 这样啊,知道了,谢谢您这么耐心帮我解答,麻烦了

#6 楼 @ohmygod 不客气 ;) 多看多练自然就熟悉了,共同学习!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号