2012-01-31 2 views
3

Ruby에서 인라인 C를 사용하여 매우 재귀적인 함수를 다시 작성하려고합니다. 나는 다음과 같은 코드를 사용하여 인라인 C에서 이것을 해내 노력하고Ruby/Inline C에서 정의되지 않은 인수 수락

def each_entity(*types) 
     # Do something and recurse. 
    end 

: 그것은 루비 같을 것이다, 즉 함수는 인수의 정의되지 않은 번호를 받아

VALUE each_entity_c(int argc, VALUE *argv) 
    { 
     // ... 
    } 

을하지만이를 산출 컴파일 오류 :

inline.rb:486:in `ruby2c': Unknown type "VALUE *" (ArgumentError) 

C에서이 작업을 수행하는 올바른 방법입니까? 그렇다면이 오류의 원인은 무엇입니까? 그렇지 않다면 어떻게됩니까? 내가 잘못 본게 아니라면

+0

어디에서 'VALUE'을 (를) 선언하셨습니까? – asaelr

+0

C의'...'는 당신이 원하는대로하지 못합니까? – prelic

+0

@asaeler, VALUE는 Ruby C 코어에서 정의됩니다. "C에서는 모든 Ruby 변수의 유형이 VALUE입니다.이 값은 Ruby 객체에 대한 포인터이거나 즉 치값입니다."[Pickaxe] (http : // rubycentral.com/pickaxe/ext_ruby.html)). 나는 VALUE가 적절하게 정의되었다고 확신한다. 왜냐하면 나는 경고를하지 않고 VALUE each_entity_c (int test) {...}'함수를 정의 할 수 있기 때문이다. – user2398029

답변

1

builder.c 대신에 메서드를 정의 할 때 builder.c_raw (또는 builder.c_raw_singleton)을 사용해보십시오. args 목록의 끝에 VALUE self을 추가 할 수는 있지만 내 테스트와 함께 작동하거나 작동하지 않는 것으로 보입니다. 이 루비를 매개 변수로 VALUE 유형을 수용하도록

inline do |builder| 

    builder.c_raw <<-EOS, :arity => -1 
    VALUE each_entity_c(int argc, VALUE *argv, VALUE self) 
    { 
     // ... 
    } 
    EOS 
end 

builder.c 사용은, 루비 인라인 함수를 다시 것이고, C 이러한 변환 코드를 추가합니다 : 그것은 명시 적으로 인수에 대응을 지정 가치가있을 수도, 안전을합니다 원본에 입력하십시오. 이미 VALUE 인수를 기대하는 코드를 작성 중이므로이 변환을 원하지 않으므로 c_raw을 사용해야합니다.

+0

매력처럼 작동합니다. – user2398029

0

, 당신은 당신이 원하는 :

VALUE each_entity_c(VALUE self, VALUE args) 
{ 
    // args is a Ruby array with all arguments 
} 
rb_define_method(class, "MyClass", each_entity_c, -2); 

C 함수는 모든 인수와 루비의 배열을 제공됩니다.