痛饮perl的类型表(下)的std ::矢量 不返回perl的期望输出

问题描述 投票:3回答:2

我想输入一个类型映射(出)的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"
c++ perl swig
2个回答
3
投票

commit方法只是返回一个数组的引用,而不是数组引用数组。也许它看起来像数组引用数组,因为你将结果分配到一个数组?

在任何情况下,不接触类型映射代码,就可以取消引用函数调用

@commitReturn = @{$SomeClass->commit()};

或者创建一个包装方法取消对它的引用您

package SomeClass;
...
sub commit_list {
    my $self = shift;
    @{$self->commit()};
}
...
@commitReturn = $SomeClass->commit_list();

1
投票

要参考的返回数组,而不是一个数组,你必须控制摞这样的Perl的人都知道返回多个标量。

the documentation

参数堆栈指针的当前值被包含在可变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++;
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.