[#1320] [MethodIndex] Bug and question — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

32 messages 1998/01/23
[#1321] Re: [MethodIndex] Bug and question — matz@... (Yukihiro Matsumoto) 1998/01/23

まつもと ゆきひろです

[#1323] Re: [MethodIndex] Bug and question — keiju@... (Keiju ISHITSUKA) 1998/01/23

けいじゅ@日本ラショナルソフトウェアです.

[#1332] Re: [MethodIndex] Bug and question — keiju@... (Keiju ISHITSUKA) 1998/01/27

けいじゅ@日本ラショナルソフトウェアです.

[#1333] Re: [MethodIndex] Bug and question — matz@... (Yukihiro Matsumoto) 1998/01/27

まつもと ゆきひろです

[#1334] Re: [MethodIndex] Bug and question — keiju@... (石塚圭樹 ) 1998/01/27

けいじゅ@日本ラショナルソフトウェアです.

[#1351] Re: [MethodIndex] Bug and question — keiju@... (石塚圭樹 ) 1998/01/29

けいじゅ@日本ラショナルソフトウェアです.

[#1353] Re: [MethodIndex] Bug and question — matz@... (Yukihiro Matsumoto) 1998/01/29

まつもと ゆきひろです

[#1354] Re: [MethodIndex] Bug and question — keiju@... (石塚圭樹 ) 1998/01/29

けいじゅ@日本ラショナルソフトウェアです.

[#1355] Re: [MethodIndex] Bug and question — matz@... (Yukihiro Matsumoto) 1998/01/30

まつもと ゆきひろです

[ruby-dev:1216] Re: var arg method

From: matz@... (Yukihiro Matsumoto)
Date: 1998-01-06 06:59:12 UTC
List: ruby-dev #1216
まつもと ゆきひろです

In message "[ruby-dev:1215] var arg method"
    on 98/01/06, Kikutani Makoto <kikutani@jdc.ericsson.se> writes:

|きくたにです。
|
|Slang拡張製作中です。
|
|rubyのほうで、 def slsmg_printf(fmt, *arg) で定義されるような
|メソッドを、Cのほうで、 SLsmg_printf あるいは SLsmg_vprintf を呼ぶ
|ようにして作ります。これらはprintf(3)、vprintf(3)に相当するものです。
|
|rb_define_method の argcに -1 を入れて配列で渡し、
|rb_scan_args のフォーマットに3文字目に * を入れて使うのかとも
|思うのですが、具体的なコーディングがよくわかりません。

rb_define_methodのargcに-1を指定すると実際の呼出し時には
argc/argv/selfの形式で引数が渡されます(-2を指定すると
self/args(Array)で渡される).

SLsmg_vprintfの具体的な呼び出し方が分かりませんが,


  static VALUE
  slsmg_printf(argc, argv, self)
      int argc;
      VALUE *argv;
      VALUE self;
  {
      char *fmt;
      int i;

      Check_Type(argv[0], T_STRING);
      fmt = RSTRING(argv[0])->ptr;
      argv++; argc--;

      for (i=0;i<argc;i++) Check_Type(argv[i], T_STRING);
      SLsmg_printf(fmt, argc, argv); //???
      return Qnil;
  }


のようにできればよいのではないかと思います.SLsmg_vprintfの
引数によってはargcによって場合わけする必要が出て来るでしょう.


     switch (argc) {
       case 0:
         SLsmg_printf(fmt);
         break;
       case 1:
         SLsmg_printf(fmt, RSTRING(argv[0])->ptr);
         break;
       case 2:
         SLsmg_printf(fmt, RSTRING(argv[0])->ptr, RSTRING(argv[1])->ptr);
         break;
         :
     }

rb_scan_argsのフォーマット文字列に"*"を指定した場合対応する
変数にはRubyの配列が格納されます.一般的にはCからはargc/argv
の方が使いやすいので,あまり必要ないと思います.

                                まつもと ゆきひろ /:|)

In This Thread