我有一个 SWIG 文件来为语言进行许多绑定。C源码中有一个变量,它是一个定长列表,整数类型。当我在 Perl 中访问它时,它没有任何项目 - 只是表明它是一个数组。
Python 中也存在同样的问题,但我可以使用 SWIG 类型图解决该问题:
#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
perl 脚本在运行时向我显示“len: 10”,但数组为空:
$i=1;
foreach(@m) {
print $i, "'", $_, "'\n";
$i=$i+1;
}
结果是:
0''
我错过了什么?
谢谢,
一种。
编辑:这是 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;
}
现在,这个脚本产生这个结果:
len: 10
0''
"len: 10" 输出来自 SWIG typedef - 请参阅 "printf("len: %d..." 行...