Go to the first, previous, next, last section, table of contents.


例 4: リスト値を返す

さて、今度は、先の例を改造して、2 つの引数の和と差の両方を返すようにして みましょう。

Perl sub は

sub AddSubtract
{
   my($a, $b) = @_ ;
   ($a+$b, $a-$b) ;
}

のようになり、C 関数は

static void
call_AddSubtract(a, b)
int a ;
int b ;
{
    dSP ;
    int count ;

    ENTER ;
    SAVETMPS;

    PUSHMARK(sp) ;
    XPUSHs(sv_2mortal(newSViv(a)));
    XPUSHs(sv_2mortal(newSViv(b)));
    PUTBACK ;

    count = perl_call_pv("AddSubtract", G_ARRAY);

    SPAGAIN ;

    if (count != 2)
        croak("Big trouble\n") ;

    printf ("%d - %d = %d\n", a, b, POPi) ;
    printf ("%d + %d = %d\n", a, b, POPi) ;

    PUTBACK ;
    FREETMPS ;
    LEAVE ;
}

となります。

注意点

  1. リストコンテキストが必要なため、 G_ARRAY を使用します。
  2. スタックから 2 つの値を取り出すため、今回 2 つの POPi を使ってい ることは、驚くに値しないでしょう。それよりも、注目すべきは、スタックから 取り出したときに逆順となることです。 reverse order.


Go to the first, previous, next, last section, table of contents.

検索式: