我正在构建一个模块,该模块连接到相机,拍照并读取数据。所有这些都在Inline::C命令中进行。使用PDL documentation中的过程,我可以创建一个pdl *并将其返回。但是,相机可能无法拍照,在这种情况下,我想按照通常的0返回my $pic_pdl = $Camera->TakePicture or die "Failed to take image"。这似乎意味着我将需要使用Inline_Stack_Push机制,但是我不确定如何将pdl *正确转换为SV*。另外,如果可能的话,我也想将$!设置为错误代码。可以内联完成吗?

最佳答案

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的接口(interface)。只需设置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

关于perl - Perl Inline::C在失败时返回pdl或0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5379418/

10-10 17:43