SWIG 实现传递 C++ 的数组到 perl

写了个基本的例子,作为后面的参考。下面的是 C++ 程序,我们看见用 vector<int> 返回了一个对象。一个函数 init() 是为了初始化随机种子,之后产生的 functor 也就是 random_number 作为一个 generator 通过 generate 这个 algorithm 对返回的 vector<int> 进行了赋值。

// random_array.cpp
#include <vector>
#include <iterator>
#include <algorithm>

#include <cstdlib>
#include <ctime>

using namespace std ;

class random_number {
 int q ;
public:
 random_number( int p ) : q(p) {}

 int
 operator() () {
 return rand() % q ;
 }
} ;

vector<int>
generate_random_array( int l, int q ) {
 vector<int> v( l ) ;
 generate( v.begin(), v.end(), random_number(q) ) ;
 return v ;
}

void
init() {
 srand( time( NULL ) ) ;
}

下面是对应的头文件,声明了两个函数。

#ifndef RANDOM_ARRAY_HPP
#define RANDOM_ARRAY_HPP

#include <vector>

using namespace std ;

vector<int>
generate_random_array( int, int ) ;

void
init() ;

#endif

这里是 wrapper 的代码,和前面不一样的是我们使用了 SWIG 的 std_vector.i 这个库,另外还注意那个 %template 的作用。

%module random_array

%include "std_vector.i"

namespace std {
 %template(vectori) vector<int> ;
} ;

%{
#include "random_array.hpp"
%}

%include "random_array.hpp"

下面是 Makefile。

CXXFLAGS += -I/usr/lib/perl/5.10.1/CORE/ -D_GNU_SOURCE

random_array.so: random_array.o random_array_wrap.cxx
        $(CXX) -shared $(CXXFLAGS) $^ -o $@

random_array_wrap.cxx: random_array.i
        swig -c++ -perl $^

.PHONY: clean

clean:
        rm -f *.o *.pm *~ *.so *_wrap.*

测试程序。

#!/usr/bin/perl -w
BEGIN {
 push @INC, "." ;
}

use strict ;
use random_array ;

random_array::init() ;
my $arr = random_array::generate_random_array( 20, 100 ) ;
for( my $i = 0 ; $i < @$arr ; ++ $ i ) {
 print $arr->[$i], "\n" ;
}

——————
God says to man, “I heal you therefore I hurt, love you therefore punish.”

Advertisements
SWIG 实现传递 C++ 的数组到 perl

一个有关“SWIG 实现传递 C++ 的数组到 perl”的想法

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s