[ruby-ext:02312] 拡張ライブラリでの継承について

View: New views
4 Messages — Rating Filter:   Alert me  

[ruby-ext:02312] 拡張ライブラリでの継承について

by Fujioka :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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: 拡張ライブラリでの継承について

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

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: 拡張ライブラリでの継承について

by U.Nakamura :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

こんにちは、なかむら(う)です。

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: 拡張ライブラリでの継承について

by Fujioka :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

fujiokaです。

Yukihiro Matsumoto wrote:
> 継承する場合にはスーパークラスが期待している構造と自クラスの
> 構造が一致している必要があります。ここで、スーパークラスとし
> たいArrayクラスのタイプはT_ARRAYで、Personクラスはalloc関数
> を見るかぎりT_DATAです。これを両立させることは実装上不可能で
> す。ごめんなさい。
>
ふむふむ。なるほど、了解しました。
# お聞きしているのはこっちなので、
# 「ごめんなさい。」ってあやまる必要はないと思います。
# もしかして口ぐせとか。

U.Nakamura wrote:
> アロケータを定義する場合、本来ご先祖様がやるはずのアロケーシ
> ョン処理もちゃんと肩代わりしてあげないといけません。たぶん。
> そういうことを考え始めるとめんどくさいので、シンプルに(非公開
> の)インスタンス変数として保持しちゃダメですか。
>
いや、テクニックを知りたいだけなので、これで十分です。
なるほど、インスタンスで保持するのがよさそうですね。
もしかして、そもそも構造体をラッピングして保持するようなことを
まったくやらずともデータの保持ってできるんですね。
しかも、GCのこともあまり気にせずに。
欠点としては遅いかな?

またわからなかったらお聞きします。ありがとうございました。