我正在构建一个连接到相机、拍照并将数据读入 piddle 的模块。所有这些都发生在一个 Inline::C 命令中。使用PDL 文档中的过程,我可以创建pdl *
并返回它。但是相机可能无法拍照,在这种情况下我想0
按照通常的约定返回my $pic_pdl = $Camera->TakePicture or die "Failed to take image"
。这似乎意味着我将需要使用该Inline_Stack_Push
机制,但我不确定如何正确地pdl *
将SV*
. 如果可能的话,我也想设置$!
错误代码。这可以在 Inline 中完成吗?
问问题
247 次
1 回答
6
通过类型映射中的代码将pdl*
其转换为 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 回答