2

カメラに接続し、写真を撮り、データをピドルに読み込むモジュールを構築しています。これらはすべて Inline::C コマンドで行われます。PDL ドキュメントの手順を使用して、を作成しpdl *て返すことができます。ただし、カメラが写真を撮れない可能性があります。その場合は0、通常の約束に従って返品したいと思いmy $pic_pdl = $Camera->TakePicture or die "Failed to take image"ます。これは、メカニズムを使用する必要があることを意味しているようInline_Stack_Pushですが、 を に適切に変換する方法がわかりませpdl *SV*。また、できれば$!エラーコードもセットしたいです。これはインラインで実行できますか?

4

1 に答える 1

6

pdl*、typemap にあるコードによって SV に変換されます。

$ cat `perl -E'use PDL::Core::Dev; say PDL_TYPEMAP'`
TYPEMAP
pdl*    T_PDL
pdl *   T_PDL
Logical T_IV
float   T_NV

INPUT

T_PDL
        $var = PDL->SvPDLV($arg)


OUTPUT

T_PDL
        PDL->SetSV_PDL($arg,$var);

私がそれを正しく読めば、次のようなことができるはずです:

SV* my_new {
    pdl* p = NULL;

    ...

    if (error) {
        if (p)
            free(p);  /* I think */
        return &PL_sv_undef;
    } else {
        SV* rv = newSV(0);
        PDL->SetSV_PDL(rv, p);
        return rv;
    }
}

に関しては$!、これは単純に C の へのインターフェースerrnoです。設定するだけですerrno

$ perl -E'use Inline C => "void f(int i) { errno = i; }"; f($ARGV[0]); say 0+$!; say $!;' 2
2
No such file or directory

$ perl -E'use Inline C => "void f(int i) { errno = i; }"; f($ARGV[0]); say 0+$!; say $!;' 3
3
No such process

$ perl -E'use Inline C => "void f(int i) { errno = i; }"; f($ARGV[0]); say 0+$!; say $!;' 4
4
Interrupted system call
于 2011-03-21T17:38:01.807 に答える