Rubyで簡単に3Dゲームを作るという野望のためには、C++の関数がRubyのハッシュを返さないといけない(JSR184でそう決まっているから)のですよ。 例えばこんな感じで使いたい。 main.rb requrie 'mylib' h = hello () # hello()はC++の拡張ライブラリの関数 pp h # hはRubyのハッシュ $ ./main.rb {"apple"=>100, "banana"=>200} どうやってCからRubyを操作すればいいかというと ruby.h とそこからincludeされる intern.h を調べると(他に情報源がないから) どうやらこれで良いようだ。 nclude "ruby.h" VALUE wrap_hello (VALUE self) { VALUE hash = rb_hash_new(); VALUE key1 = rb_st
2008-01-09 15:51:08 +0900 (1927d); rev 19 これは草稿です。 いずれ正式なところに移す予定。 対象とする読者 本稿は以下のような読者を対象にしています。 Ruby の拡張ライブラリを書いたことがない C プログラミングがそれなりにできる Ruby プログラミングがそれなりにできる 2 に関して。 「ポインタって何?」レベルの人は不可です。 構造体とポインタをちゃんと使ってプログラミングのできる人を対象とします。 3 に関して。 以下のプログラムの結果がどうなるか、 考えるだけでわかるようにしておいてください。 class C p self # 何が表示される? def C.m puts '1' p self end def m puts '2' p self end end C.m # 何が表示される? C.new.m # 何が表示される? このマニ
はじめに 表題のとおりでよく考えれば当たり前なのですが、ちょっとハマったので書いておきます。 要約すると、Rubyの拡張ライブラリを作る場合、用意されているALLOC()などのメモリ確保マクロを使わないときには、ちゃんと自分でGCを呼ぶ必要がある、という話です。 環境 Ruby 1.9.2p180 (2011-02-18) [i686-linux] 本題 こんなライブラリがあったとして // foo_lib.hpp #include <stdlib.h> typedef struct Foo { double bar[1000000]; } Foo; Foo* create_foo() { Foo* foo = (Foo*)malloc(sizeof(Foo)); if (foo == NULL) throw "<Memory allocation failed>"; return foo
目次 準備 まずはC言語プログラムを呼び出す 簡単な数値のやりとり NArray配列を渡す Swigを使ってお手軽変換 参考文献 準備 このチュートリアルではRuby 1.8系列の使用を前提にしています。 確認はすべてRuby 1.8.4 [i386-Cygwin]で行いました。 NArrayはVersion 0.5.8を用いています。 またそれ以外に以外に以下のものが必要です。 Cコンパイラ Rubyのコンパイルに用いたものと同じものが必要です。 バイナリパッケージを導入した場合はどのコンパイラでビルドされたものか 知る必要がありますが、UNIX系ではたいていgccです。 ruby.h, mkmf.rb Rubyをソースコードから自分でビルドした場合はインストールされていると 思いますが、バイナリパッケージを導入した場合はruby.hやmkmf.rbがあるか 確認する必要があります。開発
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く