2014-07-18 1 views
1

rake compile 명령을 실행하면 내 rb_define_singleton 및 rb_define_method 호출이 중단되는 이유를 파악하는 데 많은 어려움을 겪고 있습니다.c (또는 C++)에서 rb_define_singleton_method 사용

첫째, 하나의 문제는 내가 사용하는 값을 결정하기 위해 마지막 정수 인수가 실제로 무엇을 나타내는 지에 대해 잘 모르겠다는 것입니다. 그리고 이것을 설명하는 문서를 찾을 수 없었습니다. 그렇기 때문에 나는 그냥 추측하지만 문제는 내 관심사는

이 두 번째로, 내 빌드 make를 호출에 다음과 같은 오류와 함께 실패 그래서 어쨌든 세번째 인수 것 같다 오전 :

make compiling ../../../../ext/fftw/fftw.cpp ../../../../ext/fftw/fftw.cpp: In function 'void Init_fftw()': ../../../../ext/fftw/fftw.cpp:64:58: error: invalid conversion from 'VALUE ()(VALUE, VALUE) {aka long unsigned int ()(long unsigned int, long unsigned int)}' to 'VALUE ()(...) {aka long unsigned int ()(...)}' [-fpermissive] rb_define_singleton_method(cNMatrix, "r2c", fftw_r2c, 1); ^In file included from /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/ruby.h:1694:0, from /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby.h:33, from ../../../../ext/fftw/fftw.cpp:1: /Users/private/.rvm/rubies/ruby-2.1.2/include/ruby-2.1.0/ruby/intern.h:216:6: error: initializing argument 3 of 'void rb_define_singleton_method(VALUE, const char*, VALUE ()(...), int)' [-fpermissive] void rb_define_singleton_method(VALUE, const char, VALUE(*)(ANYARGS), int); ^make: * [fftw.o] Error 1 rake aborted!

오류가 나는 아니다 의미 이 정의를 성공적으로 만들어야하기 때문에 루비에서 함수를 테스트 할 수 있습니다. f irst 그래서 나는 그것을 시도하고 최소한하려고 파일을 벗겼다

지금까지 나는 어느 쪽도 일하는 것처럼 보였던 여러 가지 타입으로 주조하려고 노력했다. 나는 플래그와 컴파일러 선택으로 extconf에서 잘못 설정하고 있다고 생각하기 시작했다. 그러나 나는 확실하지 않다.

source code for the failing file is on github

어떤 조언을 환영받을 것입니다! 감사합니다

답변

2

루비 C API에 대한 설명서가 조금 부족합니다. 이것에 대한 유일한 '공식'문서 정보는 README.EXT

입니다. C 함수는 20 개의 서명 중 하나를 가질 수 있지만 C에 과부하가 없으며 모든 버전의 20 버전을 생성하므로 많은 반복이 추가됩니다. 인터페이스에 RUBY_METHOD_FUNC(your_function)을 사용하여 함수 포인터를 타입 변환하십시오. 당신의 C의 기능은 다음과 같습니다

공 17 개까지 수단 :

VALUE some_function(VALUE self, VALUE arg1, VALUE arg2); /* if you had passed 2 */ 

을 정수는 단순히 기능 걸리는 인수의 수 당신이 사용중인 서명

정수 매개 변수는 루비를 말한다 , 자기를 포함하지 않음 (따라서 루비 토지에 인수가 전달 된 수와 동일 함)

-1은 함수에 서명이 있어야 함을 의미합니다.

VALUE some_function(VALUE self, VALUE *argv, VALUE argc); 

즉, 인수 배열과 인수 개수가 전달됩니다. 이것은 또한 루비가 메소드가 어떤 수의 인자로 호출 될 수 있음을 의미합니다 (즉,보고 된 결과는 -1이됩니다). 이 경우 종종 rb_scan_args이 유용합니다.

마지막 -2 함수가

VALUE some_function(VALUE self, VALUE args); 

args처럼 인자를 함유 루비 어레이 (다시 인수의 수를 전달하는 발신이 가능)되어 보이는 것을 의미한다.

불행히도 typecasting은이 오류가 발생하면 컴파일 타임 오류가 아닌 런타임시 일부 정의되지 않은 방식으로 오류가 날 것임을 의미합니다.

+0

이것은 좋은 해결책으로 현재 해결 된 내 문제를 정확하게 해결하지 못하므로 선택할 수 없습니다. 이 버그에 대한 응답에서 찾은 전체 솔루션을 https://github.com/thisMagpie/fftw/issues/22에 추가 한 다음 선택하면됩니까? – Magpie

+2

RUBY_METHOD_FUNC (some_function)가 정확한 타입 변환을 수행합니다. 원하는 답을 받아들이면 자유 롭습니다. –

+0

나는 둘 다 생각하는 것이 좋습니다. 이것을 올바르게 시험해보고 그것이 어떻게 작동 하는지를 이해할 수 있는지 알아 보겠습니다. – Magpie