2012-04-18 24 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を持っています単一の用語&オペランドは左側の値 "を必要とします(正確なメッセージではありません。別の自然な笑い声で与えられた)。それは私の使用法に関するものですStringValuePtr。私は間違って何をしていますか、それをどうやって修正することができますか?

+0

参照演算子 '&'、* *左側の値を使用する必要があり、すなわち、定数に適用することができませんでした。 – kirilloid

+0

@kirilloidコードを修正する方法はありますか? – sawa

答えて

2

まず、StringValuePtr does not return a null-terminated C stringassignment operatorに適しています。 StringValueCStrマクロを使用する必要があります。マクロはパラメータとしてVALUEを使用します。

#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

関連する問題