2011-09-19 10 views
1

내가 구현 한 루비 C 확장 (즉 루비 스크립트에서 호출하기 C 함수를) 다음은 cFuncton를 호출 루비 스크립트의 코드에 따라 파일 "cImplementation.c"va_list를 사용하여 오류를 해결하는 방법은 무엇입니까?

#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); 
} 

에서 C로 구현 된 가변 인수 기능입니다 아래 pssing printf의 형식의 문자열로() 메소드 :

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

위의 시험 1 차와 우리는 시험 2로 우리가 emplty 문자열다면 어떤 아웃 넣어 얻을니까. 그래서 위의 문제를 해결하고 예상되는 출력을 아래의 방법으로 얻을 수있는 방법을 제안 할 수 있습니다. 내 메시지 :: 안녕하세요, Im Here, 나의 의견 :: 100. 감사합니다.

+0

왜'C++'태그 :

아마 여기에 예를 들어 다음과 같은 시도? –

답변

0

함수 인수를 얻으려면 rb_scan_args를 사용해야합니다. 그것들은 vsnprintf에 직접 전달 될 수 없습니다. http://www.eqqon.com/index.php/Ruby_C_Extension_API_Documentation_(Ruby_1.8)

+0

James에게 감사하지만, argc와 argv는 rb_scan_args()에 전달해야하는 함수 서명에 없다. 그래서 다른 해결책이 있습니까? – BSalunke

+0

'rb_define_singleton_method'에 넘겨주는 함수는'VALUE func (int argc, VALUE * argv, VALUE klass)'서명을 가지고 있습니다. –

+0

당신은'rb_scan_args'를 호출하는 새로운 함수를 쓰고 그 함수를 호출 할 수 있습니다. –

관련 문제