SWIG typedef-Perl数组
我有一个SWIG文件来为各种语言进行许多绑定。C源代码中有一个变量,它是一个固定长度的列表,类型为整数。当我在Perl中访问它时,它没有任何项——只是显示它是一个数组 Python中也存在同样的问题,但我可以使用SWIG类型映射来修复这个问题:SWIG typedef-Perl数组,perl,swig,c-api,Perl,Swig,C Api,我有一个SWIG文件来为各种语言进行许多绑定。C源代码中有一个变量,它是一个固定长度的列表,类型为整数。当我在Perl中访问它时,它没有任何项——只是显示它是一个数组 Python中也存在同样的问题,但我可以使用SWIG类型映射来修复这个问题: #ifdef SWIGPYTHON %typemap(out) int [ANY] { ... 好的,我想用Perl再做一次——但我不是Perl专家,所以我可以为Perl修复这个类型映射。这就是我所尝试的: #ifdef SWIGPERL %ty
#ifdef SWIGPYTHON
%typemap(out) int [ANY] {
...
好的,我想用Perl再做一次——但我不是Perl专家,所以我可以为Perl修复这个类型映射。这就是我所尝试的:
#ifdef SWIGPERL
%typemap(out) int [ANY] {
SV* sv = newSV(0);
AV* av = (AV *)sv_2mortal((SV *)newAV());
int i = 0,len = 0;
printf("len: %d\n", $1_dim0);
len = $1_dim0;
for (i = 0; i < len ; i++) {
SV* perlval = newSV(0);
sv_setiv(perlval, (IV)$1[i]);
av_push(av, perlval);
}
SvSetSV($result, newRV_noinc((SV *)av));
}
#endif
结果是:
0“
我错过了什么
谢谢
a
编辑:以下是Perl脚本:
#!/usr/bin/perl
use example1;
# this function set up the built-in list in example1 module
example1::get_att(7);
my @m = $example1::m->{ilist};
# "m" is a C structure in C source, and it has an "int ilist[10];" member.
# get_att(int n) will fill this list with "n" number
# This will be accesable in binded lanugage (eg in Python) as like this:
# print m.ilist -> [0, 3, 6, 9, 12, 15, 18, 0, 0, 0]
$i = 0;
foreach(@m) {
print $i, "'", $_, "'\n";
$i=$i+1;
}
0: '1'
1: '2'
2: '3'
现在,此脚本生成以下结果:
len: 10
0''
“len:10”输出来自SWIG typedef-请参阅“printf”(“len:%d…”行…我以前没有使用过SWIG,但我认为了解一点它可能会很有趣。在阅读了几个小时之后,我想我可能已经找到了一些可以解决您的问题的方法。首先,我们需要接口文件
示例。我:
%module example
%typemap(out) int [ANY] {
AV* av = newAV();
int i = 0,len = 0;
len = $1_dim0;
for (i = 0; i < len ; i++) {
SV* perlval = newSV(0);
sv_setiv(perlval, (IV)$1[i]);
av_push(av, perlval);
}
$result = newRV_noinc((SV*) av );
sv_2mortal( $result );
argvi++;
}
%typemap(in) int [ANY] {
AV *tempav;
I32 len;
int i;
SV **tv;
if (!SvROK($input))
croak("Argument $argnum is not a reference.");
if (SvTYPE(SvRV($input)) != SVt_PVAV)
croak("Argument $argnum is not an array.");
tempav = (AV*)SvRV($input);
len = av_len(tempav);
$1 = (int *) malloc((len+1)*sizeof(int));
for (i = 0; i <= len; i++) {
tv = av_fetch(tempav, i, 0);
$1[i] = (int) SvIV(*tv);
}
}
%typemap(freearg) int * {
free($1);
}
%typemap(memberin) int [ANY] {
int i;
for (i = 0; i < $1_dim0; i++) {
$1[i] = $input[i];
}
}
%inline %{
struct m {
int ilist[3];
};
%}
现在输出为(编译接口文件并运行Perl脚本之后):
注意:
- 我第一次安装Swig3.0.8(在Ubuntu 16.04上)是使用
- 然后,我编译了接口文件
example.I
,使用:
$ swig -perl5 example.i
$ gcc -fpic -c -Dbool=char -D_GNU_SOURCE \
-I/usr/lib/x86_64-linux-gnu/perl/5.22/CORE example_wrap.c
$ gcc -shared example.o example_wrap.o -o example.so
我已完成帖子-请参见“编辑"部分。你还需要什么?是的,那是交叉发布的-有没有论坛/邮件列表,这取决于Stackoverflow,并将标记为交叉发布?我想SO和Perlmonks是两个不同的地方。无论如何,我为交叉发布道歉,抱歉。嗨,Håkon,非常感谢你的帮助。看起来像我的SWIG文件、类型图和所有的组件除了Perl文件外,其他元素都是正确的。我不是Perl大师(我真的不懂Perl),我只是把赋值和数组遍历搞砸了-请看这里的Perl脚本:。再次感谢!
0: '1'
1: '2'
2: '3'
$ sudo apt-get install swig
$ swig -perl5 example.i
$ gcc -fpic -c -Dbool=char -D_GNU_SOURCE \
-I/usr/lib/x86_64-linux-gnu/perl/5.22/CORE example_wrap.c
$ gcc -shared example.o example_wrap.o -o example.so