【问题标题】:How do I pass Perl arrays to/from SWIG?如何将 Perl 数组传入/传出 SWIG?
【发布时间】:2010-11-15 12:57:30
【问题描述】:

在 Perl 中,我习惯于在 subs 之间传递数组

sub abc {
  foreach my $x (@_) { print $x; }
  return (0, 1, 2);
}

如何使用 SWIG 函数实现类似的行为?

痛饮这个:

std::vector<int> print_list(std::vector<int> l)
{
  std::vector<int>::iterator iter;
  for(iter=l.begin(); iter!=l.end(); iter++) {
    printf("int %d\n", *iter);
  }

  return l;
}

产生一个期望数组引用并返回数组引用的子?我正在使用 SWIG 附带的 stl 模板。

我需要为此编写一个类型映射吗?似乎这已经在某处被覆盖了。

【问题讨论】:

    标签: perl swig


    【解决方案1】:

    typemap 已经为您编码,但您仍然需要实例化它。

    正如SWIG/STL doc 中所指出的,您必须将vector&lt;int&gt; 声明为vectori 并将您的Perl 数组转换为它

    如果您想进行透明转换,您必须自己编写类型映射代码。

    下面的代码示例,以及您的示例

    print_list.hxx

    #include <vector>
    std::vector<int> print_list(std::vector<int> l);
    

    print_list.cpp

    #include <cstdio>
    #include <vector>
    
    #include "print_list.hxx"
    
    using namespace std;
    
    vector<int> print_list(vector<int> l) {
        vector<int>::iterator iter;
        for(iter=l.begin(); iter!=l.end(); iter++) {
            printf("int %d\n", *iter);
        }
        return l;
    }
    

    print_list.i

    %module print_list
    %include "std_string.i"
    %include "std_vector.i"
    
    namespace std {
        %template(vectori) vector<int>;
        %template(vectord) vector<double>;
    };
    
    
    %{
    #include "print_list.hxx"
    %}
    
    
    %include "print_list.hxx"
    

    test_print_list.pl

    #! /usr/bin/perl
    use Data::Dumper;
    
    use print_list;
    
    my @row = (1, 2, 4);
    my $vi = new print_list::vectori();
    foreach my $val (@row) {
        $vi->push($val);
    }
    
    print Dumper(print_list::print_list($vi));
    

    【讨论】:

    • 即使对于vector它是否保持不变?
    • 另外,如果我必须从 c++ 函数返回一个向量 并将其作为数组在 Perl 中捕获,你有代码 sn-p 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多