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