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


Undef 値や空リストを返す

関数の異常を示すために、状態変数を別に用意するよりも、単に`undef' 値や空リストを返したい場合があります。 rpcb_gettime() 関数を、そ のような場合にあてはめてみましょう。この関数がうまくいったときには、時刻 を返し、問題があったときには、 `undef' 値を返すようにしてみましょう。 次の Perl コードでは、 $timep の値が `u' か有効な時刻のどちら かになることになります。

$timep = rpcb_gettime( "localhost" );

次の XSUB では、関数型に void を用いて、RETVAL 変数を作らないよう にし、 CODE: ブロックを使って、必要なコードはすべて用意しているこ とをコンパイラに示しています。 sv_newmortal() の呼び出しで返却値 を `undef' で初期化し、これをデフォルトの返却値としています。

void
rpcb_gettime(host)
     char *  host
     CODE:
     {
     time_t  timep;
     bool_t x;
     ST(0) = sv_newmortal();
     if( rpcb_gettime( host, &timep ) )
          sv_setnv( ST(0), (double)timep);
     }

次の例では必要となったときに、明示的に `undef' 値を返却値として設定 する方法を示します。

void
rpcb_gettime(host)
     char *  host
     CODE:
     {
     time_t  timep;
     bool_t x;
     ST(0) = sv_newmortal();
     if( rpcb_gettime( host, &timep ) ){
          sv_setnv( ST(0), (double)timep);
     }
     else{
          ST(0) = &sv_undef;
     }
     }

空リストを返すには、 PPCODE: ブロックを使ったうえで、スタック上に 返却値を積まないでおきます。

void
rpcb_gettime(host)
     char *  host
     PPCODE:
     {
     time_t  timep;
     if( rpcb_gettime( host, &timep ) )
          PUSHs(sv_2mortal(newSVnv(timep)));
     else{
     /* スタックに何も積まないので、 */
     /* 暗黙のうちに空リストが返される。 */
     }
     }


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

検索式: