|
View:
New views
4 Messages
—
Rating Filter:
Alert me
|
|
|
[ruby-ext:02312] 拡張ライブラリでの継承についてfujiokaです。
C言語での拡張ライブラリの書き方を勉強中なのですが、 継承がどうしてもわからないので、教えて頂けませんでしょうか。 #include <ruby.h> VALUE rb_cPerson; typedef struct { char name[256]; char family[256]; } Person; VALUE Person_alloc(VALUE klass){ Person *ptr; return Data_Make_Struct(klass, Person, 0, -1, ptr); } VALUE Person_view(VALUE self){ Person *ptr; Data_Get_Struct(self,Person,ptr); printf("%s\n",ptr->name); return(self); } VALUE Person_initialize(VALUE self,VALUE name,VALUE family){ Person *ptr; /* check type*/ Check_Type(name,T_STRING); Check_Type(family,T_STRING); Data_Get_Struct(self,Person,ptr); strcpy(ptr->name,StringValuePtr(name)); strcpy(ptr->family,StringValuePtr(family)); return(Qnil); } void Init_Jikken(VALUE val){ rb_cPerson = rb_define_class("Person", rb_cArray); rb_define_alloc_func(rb_cPerson, Person_alloc); rb_define_private_method(rb_cPerson, "initialize", Person_initialize, 2); rb_define_method(rb_cPerson, "view", Person_view, 0); } このPersonクラスはArrayを継承したいのですが、 require 'Jikken' jikken=Person.new("henoheno","moheji") jikken.push("hoge") を実行すると fujioka@vmmain:~/rap/Jikken$ ruby jikken.rb jikken.rb:24: [BUG] Segmentation fault ruby 1.8.2 (2005-04-11) [i386-linux] アボートしました と出てしまいます。このソースを参考にと言うことでも構いませんので、 教えて頂けませんでしょうか。 |
|
|
[ruby-ext:02313] Re: 拡張ライブラリでの継承についてまつもと ゆきひろです
In message "Re: [ruby-ext:02312] 拡張ライブラリでの継承について" on Thu, 29 Jun 2006 23:11:11 +0900, Fujioka <fuj@...> writes: |C言語での拡張ライブラリの書き方を勉強中なのですが、 |継承がどうしてもわからないので、教えて頂けませんでしょうか。 |このPersonクラスはArrayを継承したいのですが、 継承する場合にはスーパークラスが期待している構造と自クラスの 構造が一致している必要があります。ここで、スーパークラスとし たいArrayクラスのタイプはT_ARRAYで、Personクラスはalloc関数 を見るかぎりT_DATAです。これを両立させることは実装上不可能で す。ごめんなさい。 |
|
|
[ruby-ext:02314] Re: 拡張ライブラリでの継承についてこんにちは、なかむら(う)です。
In message "[ruby-ext:02312] 拡張ライブラリでの継承について" on Jun.29,2006 23:11:11, <fuj@...> wrote: | と出てしまいます。このソースを参考にと言うことでも構いませんので、 | 教えて頂けませんでしょうか。 アロケータを定義する場合、本来ご先祖様がやるはずのアロケーシ ョン処理もちゃんと肩代わりしてあげないといけません。たぶん。 そういうことを考え始めるとめんどくさいので、シンプルに(非公開 の)インスタンス変数として保持しちゃダメですか。 #include <ruby.h> VALUE rb_cPerson; VALUE Person_view(VALUE self){ VALUE name = rb_iv_get(self, "name"); printf("%s\n", StringValuePtr(name)); return(self); } VALUE Person_initialize(VALUE self,VALUE name,VALUE family){ /* check type*/ Check_Type(name,T_STRING); Check_Type(family,T_STRING); rb_iv_set(self, "name", name); rb_iv_set(self, "family", family); return(Qnil); } void Init_Jikken(VALUE val){ rb_cPerson = rb_define_class("Person", rb_cArray); rb_define_private_method(rb_cPerson, "initialize", Person_initialize, 2); rb_define_method(rb_cPerson, "view", Person_view, 0); } それでは。 -- U.Nakamura <usa@...> |
|
|
[ruby-ext:02315] Re: 拡張ライブラリでの継承についてfujiokaです。
Yukihiro Matsumoto wrote: > 継承する場合にはスーパークラスが期待している構造と自クラスの > 構造が一致している必要があります。ここで、スーパークラスとし > たいArrayクラスのタイプはT_ARRAYで、Personクラスはalloc関数 > を見るかぎりT_DATAです。これを両立させることは実装上不可能で > す。ごめんなさい。 > ふむふむ。なるほど、了解しました。 # お聞きしているのはこっちなので、 # 「ごめんなさい。」ってあやまる必要はないと思います。 # もしかして口ぐせとか。 U.Nakamura wrote: > アロケータを定義する場合、本来ご先祖様がやるはずのアロケーシ > ョン処理もちゃんと肩代わりしてあげないといけません。たぶん。 > そういうことを考え始めるとめんどくさいので、シンプルに(非公開 > の)インスタンス変数として保持しちゃダメですか。 > いや、テクニックを知りたいだけなので、これで十分です。 なるほど、インスタンスで保持するのがよさそうですね。 もしかして、そもそも構造体をラッピングして保持するようなことを まったくやらずともデータの保持ってできるんですね。 しかも、GCのこともあまり気にせずに。 欠点としては遅いかな? またわからなかったらお聞きします。ありがとうございました。 |
| Free embeddable forum powered by Nabble | Forum Help |