如何使用va_list解决错误?

时间:2011-09-19 10:08:58

标签: c++ c ruby linux

我已经实现了Ruby C扩展(即从ruby脚本调用C函数)以下是C文件“cImplementation.c”中实现的变量参数函数

#include<stdio.h>
static VALUE cFunction(VALUE self, VALUE exp, const char* fmt, ...)
{    
   //1st Trial to get expected output
   char buff[256];
   va_list args;
   va_start(args, fmt);
   if(vsnprintf(buf, sizeof(buff), fmt, args) > 0)
   fputs(buff, stderr);
   va_end(args);

   // 2nd Trial  to get expected output
   va_list args;
   char buf[1024];
   va_start(args,fmt);
   vsnprintf(buf, 1024, fmt, args);
   printf("String :: %s", buf);
   va_end(args);
   return Qnil;
}
void Init_MyRuby()
{
      VALUE MRuby = rb_define_module("MyRuby");
      rb_define_singleton_method(MRuby, "cFunction", cFunction, 1);
}

以下是通过pssing printf格式化字符串调用cFuncton()方法的ruby脚本代码,如下所示:

require 'cFile'
MyRuby::cFunction(expObject, "My Message:: %s, My Value:: %d", "Hi Im here", 100 ) 

上面的试验第一次我们没有得到任何输出,而在试验第二次我们得到emplty字符串。那么任何人都可以建议如何解决上述问题并得到预期的输出如下: 我的留言::嗨我在这里,我的价值:: 100。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该使用rb_scan_args来获取函数参数。它们不能直接传递给vsnprintf。

也许请尝试点击此处的示例:http://www.eqqon.com/index.php/Ruby_C_Extension_API_Documentation_(Ruby_1.8)