2011-03-21 3 views
2

카메라에 연결하여 사진을 찍고 데이터를 piddle로 읽어들이는 모듈을 만듭니다. 이 모든 작업은 인라인 :: C 명령에서 수행됩니다. PDL documentation에있는 절차를 사용하여 pdl *을 생성하고 반환 할 수 있습니다. 그러나 카메라가 사진을 찍지 못할 수도 있습니다.이 경우 보통 my $pic_pdl = $Camera->TakePicture or die "Failed to take image"에 따라 0을 반환하고 싶습니다. 이것은 Inline_Stack_Push 메커니즘을 사용해야 할 것 같지만 pdl *SV*으로 올바르게 변환하는 방법을 모르겠습니다. 또한 가능한 경우 오류 코드로 $!을 설정하고 싶습니다. 인라인에서이 작업을 수행 할 수 있습니까?Perl Inline :: C pdl을 반환하거나 실패시 0을 반환합니다.

+0

NULL을 반환하려고 했습니까? – ikegami

답변

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 
+0

알다시피, 나는 당신이 이것을 올렸을 때 typemap을보고있었습니다. 네가 옳았다는 느낌이 들었다. 그리고 C의 배경에서 오지 않았기 때문에'erro'에 대한 정보를 주셔서 감사합니다. –

+1

@Joel, [errno.h] (http://linux.die.net/man/3/errno)는'errno'를 설정하는 데 사용할 수있는 이식 가능한 상수 (예 : 거부 된 EACCES)를 제공합니다. – ikegami

관련 문제