как устранить ошибки с использованием va_list? - PullRequest
1 голос
/ 19 сентября 2011

Я реализовал расширение Ruby C (то есть, вызывая функцию C из сценария ruby). Ниже приведена функция переменного аргумента, реализованная в 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);
}

Ниже приведен код сценария ruby.это вызывает метод cFuncton () путем pssing форматированной строки printf, как показано ниже:

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

с вышеприведенной пробной версией 1, мы не получим никакой отдачи, в то время как с пробной 2 мы получим пустую строку.Поэтому любой может предложить, как решить вышеуказанную проблему и получить ожидаемый результат, как показано ниже: Мое сообщение :: Привет, я здесь, Мое значение :: 100. Заранее спасибо.

1 Ответ

0 голосов
/ 19 сентября 2011

Вы должны использовать rb_scan_args, чтобы получить аргументы функции.Они не могут быть переданы напрямую в vsnprintf.

Возможно, попробуйте следующий пример: http://www.eqqon.com/index.php/Ruby_C_Extension_API_Documentation_(Ruby_1.8)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...