在我的 XS 文件中,我有:
作为我的新方法:
matrix *
matrix::new( size_t ncols, size_t nrows )
它返回一个matrix
像它应该的对象,我可以调用方法。
然后我有一个方法调用,它创建一个新的矩阵对象并应该将它作为一个新矩阵返回:
matrix *
matrix::getInnerMatrix( )
PREINIT:
char * CLASS = (char *)SvPV_nolen(ST(0));
CODE:
RETVAL = static_cast<matrix*>(THIS->matrix::getInnerMatrix());
OUTPUT:
RETVAL
但是返回的类型是matrix=SCALAR(0x122f81c)
,因此我无法从该对象调用任何方法调用,因为 perl 解释器似乎将返回的类型视为标量值类型而不是“矩阵”对象。这是一个测试脚本:
$m1 = matrix::new(matrix,4,4);
@arr = ( 1 .. 16 );
$aref = [@arr];
$m1->assign_aref($aref);
my $m2 = $m1->getInnerMatrix();
print ref $m1; # returns "matrix" (like it should)
print "\n\n";
print ref $m2; # returns "matrix=SCALAR(0x122f81c)" (wrong)
这是我的类型图:
TYPEMAP
matrix * O_MATRIX
OUTPUT
O_MATRIX
sv_setref_pv( $arg, CLASS, (void*)$var );
INPUT
O_MATRIX
if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) {
$var = ($type)SvIV((SV*)SvRV( $arg ));
}
else {
warn( \"${Package}::$func_name() -- ${var} not a blessed SV reference\" );
XSRETURN_UNDEF;
}
我必须在我的 XS 文件或任何其他文件中进行哪些更改以确保matrix
返回纯对象?