2012-04-18 2 views
1

Ruby 용 C++ 확장을 작성하고 Ruby 배열 객체에서 Ruby 문자열 객체를 추출하고이를 C/C++ 문자열 객체.Ruby 배열에서 가져온 문자열을 C/C++ 문자열로 변환하는 방법

#include <iostream> 
#include <ruby.h> 

VALUE bar_func(VALUE self, VALUE ary){ 
    std::string s = StringValuePtr(rb_ary_entry(ary, 0)); 
    ... 
    return 0; 
} 

extern "C" VALUE rb_cFoo; 
VALUE rb_cFoo; 
extern "C" void Init_foo(){ 
    rb_cFoo = rb_define_class("Foo", rb_cObject); 
    rb_define_singleton_method(rb_cFoo, "bar", RUBY_METHOD_FUNC(bar_func), 1); 
} 

test.rb :

require "foo" 
Foo.bar(["Hello World!"]) 

내가 foo.cpp를 컴파일하려고하면 컴파일러는 "같은 것을 말하는 오류를 반환

나는 foo.cpp에이 단일 용어 & 피연산자가 왼쪽 값 " (정확한 메시지가 아님)이 필요합니다. 오류가 발생했습니다. 다른 자연 lauguage에서 주어진 ssage). 내 사용량이 StringValuePtr에 관한 것입니다. 내가 뭘 잘못하고 어떻게 고칠 수 있니?

+0

참조 연산자'&'는 * 왼쪽 값 *을 사용해야합니다. 즉 상수에 적용 할 수 없습니다. – kirilloid

+0

@kirilloid 코드를 수정하는 방법이 있습니까? – sawa

답변

2

우선 assignment operator에 적합한 StringValuePtr does not return a null-terminated C string입니다. 매개 변수로 VALUE을 사용하는 StringValueCStr 매크로를 사용해야합니다.

#define StringValueCStr(v) rb_string_value_cstr(&(v)) 

rb_string_value_cstr 함수 서명은 다음과 같습니다 : 매크로 확장 후

char * rb_string_value_cstr(volatile VALUE *ptr) 

, 코드는 다음과 같이한다 :

std::string s = rb_string_value_cstr(&rb_ary_entry(ary, 0)); 

에 코드를 다음과 같이

StringValueCStr

정의된다 나에게 잘못 보이지 않는다. 각 부분을 별도의 줄에 두어 오류의 출처를 좁힐 수 있는지 확인하십시오.

VALUE entry = rb_ary_entry(ary, 0); 
char * c_str = StringValueCStr(entry); 
std::string str = c_str; 
+1

도움과 자세한 설명을 보내 주셔서 감사합니다. – sawa