我想输入一个类型映射(出)的std ::向量。我希望它去的Perl代码作为一个数组,而不是我得到一个数组的数组,其双解引用后,包含所需的数据。我怎样才能使它在Perl字符串数组?
我已经尝试过编辑类型映射自己和使用typemaps在“std_vector.i”和“std_string.i”而不进行编辑,他们都给出了相同的结果。
这是类型映射代码:
%typemap(out) std::vector<std::string> {
int len = $1.size();
SV *svs = new SV[len];
for (int x = 0; x < len; x++) {
SV* sv = sv_newmortal();
sv_setpvn(sv, $1[x].data(), $1[x].size());
svs[x] = SvPV(sv, $1[x].size());
}
AV *myav = av_make(len, svs);
delete[] svs;
$result = newRV_noinc((SV*) myav);
sv_2mortal($result);
argvi++;
}
我测试的输出代码:
#this return a std vector<string> in the cpp code
my @commitReturn = $SomeClass->commit();
print "\n";
#this should return a string instead it returns an array.
print $commitReturn[0];
print "\n";
#this should not work, instead it returns the desired output.
print $commitReturn[0][0];
输出是:
ARRAY(0x908c88)
20790
代替:
20790
Can't use string ("20791") as an ARRAY ref while "strict refs"
你commit
方法只是返回一个数组的引用,而不是数组引用数组。也许它看起来像数组引用数组,因为你将结果分配到一个数组?
在任何情况下,不接触类型映射代码,就可以取消引用函数调用
@commitReturn = @{$SomeClass->commit()};
或者创建一个包装方法取消对它的引用您
package SomeClass;
...
sub commit_list {
my $self = shift;
@{$self->commit()};
}
...
@commitReturn = $SomeClass->commit_list();
要参考的返回数组,而不是一个数组,你必须控制摞这样的Perl的人都知道返回多个标量。
参数堆栈指针的当前值被包含在可变
argvi
。每当增加新的输出值,这是至关重要的该值递增。对于多个输出值,argvi
的最终值应为输出值的总数。
所以下面的类型映射应该足够了:
%typemap(out) std::vector<std::string> {
int len = $1.size();
for (int x = 0; x < len; x++) {
$result = sv_newmortal();
sv_setpvn($result, $1[x].data(), $1[x].size());
argvi++;
}
}