【问题标题】:incompatible pointer types passing 'char *(char *)' to parameter of type 'VALUE (*)()'将“char *(char *)”传递给“VALUE (*)()”类型参数的不兼容指针类型
【发布时间】:2015-03-08 09:35:39
【问题描述】:

我需要使用 C 代码扩展我的 ruby​​ 代码。我的 c 文件上有这个功能:

char * generateIt(char *valor) {
  struct NESSIEstruct w;
  u8 digest[DIGESTBYTES];

  int i;
  for(i=0; valor[i]!='\0'; ++i);
  int sizeo = i;

  NESSIEinit(&w);
  NESSIEadd((u8*)valor, 8*sizeo, &w);
  NESSIEfinalize(&w, digest);
  return displayIt(digest, DIGESTBYTES);
}

为了让 Ruby 可以在同一个文件中使用它,我有这个:

void
Init_whirlpool(){
  rb_mWhirlpool = rb_define_module("Whirlpool");
  rb_cClass = rb_define_class_under(rb_mWhirlpool, "Class", rb_cObject);
  rb_define_method(rb_cClass, "generate", generateIt, 1);
}

但是,当我尝试 do run: make 时,我收到以下警告:

MacBook-Pro-de-Patricio:whirlpool psantos$ 编译 whirlpool.c whirlpool.c:2021:43:警告:传递 'char 的指针类型不兼容 *(char )' 到 'VALUE ()()' 类型的参数 [-Wincompatible-pointer-types] rb_define_method(rb_cClass, "生成", generateIt, 1); ^~~~~~~~~~ /Users/psantos/.rvm/rubies/ruby-2.0.0-p598/include/ruby-2.0.0/ruby/ruby.h:1290:48: 注意:在此处将参数传递给参数 void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int); ^ 生成 1 个警告。

错误图片:(更清楚)

我该如何解决这个问题?

【问题讨论】:

    标签: c ruby


    【解决方案1】:

    rb_define_method() 采用 Ruby VALUE 类型。

    void rb_define_method(
        VALUE klass, 
        const char *name, 
        VALUE (*func)(ANYARGS), 
        int argc
    );
    

    【讨论】:

    • 看到我的函数“generateIt”返回一个字符 *。如果我将函数类型更改为 VALUE,如何返回 String (char *)?
    • @PSantos:如果 char* 是 C 字符串,那么 rb_str_new2(the_c_string);
    • @PSantos:您对该函数的签名可能类似于:VALUE generateIt(VALUE self, VALUE valor) - 查看答案中第一个链接下的示例。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2021-06-29
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    相关资源
    最近更新 更多