Как передать массивы Perl в / из SWIG? - PullRequest
2 голосов
/ 30 июля 2009

В Perl я привык передавать массивы и сабы

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

Как мне добиться подобного поведения с помощью функций SWIG?

SWIG'ing это:

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;
}

Возвращает подпрограмму, которая ожидает ссылку на массив и возвращает ссылку на массив? Я использую шаблоны stl, которые поставляются с SWIG.

Мне нужно написать карту типов для этого? Кажется, это уже где-то будет рассмотрено.

1 Ответ

4 голосов
/ 03 августа 2009

Карта типов уже закодирована для вас, но вам все еще нужно создать ее экземпляр.

Как указано в документе SWIG / STL , , вы должны объявить vector<int> как 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));
...