gpt4 book ai didi

c - SWIG typedef - 将数组返回给 Perl

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:16 29 4
gpt4 key购买 nike

我有一个 SWIG 文件,用于从 .C 文件获取输出 int 数组并将其传递给 Perl,以便我可以在 Perl 中打印数组值。 C 源代码中有一个 Function,它将返回一个 int 数组。当我尝试在 Perl 中打印这些值时,它没有打印数组值。

我有一个名为 perl.i 的 swig 文件这是我的尝试:

#ifdef SWIGPERL
%module aticara
%{
#include "include.h"
extern int myfunction();
%}
%typemap(out) int [ANY] {
}
int myfunction();
#endif

我不知道在 typemap 里面写什么。运行时调用 test.pl 的 perl 脚本,但数组为空:这是我的 test.pl

#!/usr/bin/perl
use aticara;
use feature qw(say);

my $arr = aticara::myfunction();
my $list = $arr;

my $i = 0;
for ( @$list ) {
say "$i: '$_'";
$i=$i+1;
}

正在打印空白。我不知道我缺少什么和在哪里。但我可以说的一件事是它来 self 的 swig 文件。我还分享了我的 C 文件,它将返回一个数组列表。

这是我的 C 文件:

int myfunction()
{
int a[5];
a[0] = 45;
a[1] = 4;
a[2] = 8;
a[3] = 9;
a[4] = 1;
return *a;
}

Perl 中的预期输出是:

0: 45 
1: 4
2: 8
3: 9
4: 1

但我无法获得此输出。我不太喜欢喝。如果有人帮我出去,那就太好了。提前致谢。

最佳答案

您应该返回一个指向 int 数组的指针,而不是本地数组 a 的第一个元素的内容。而是使用 malloc() 创建数组并使用 SWIG ret 类型映射来释放它。然后还创建一个 out 类型映射以将返回的数组转换为 Perl 数组。这是如何完成的示例:

示例.i

%module example
%{
#include "example.h"
%}
%typemap(out) int * {
AV *myav;
SV **svs;
int len = 0;
/* Figure out how many elements we have */
while ($1[len])
len++;
svs = (SV **) malloc(len*sizeof(SV *));
int i;
for (i = 0; i < len ; i++)
svs[i] = newSViv($1[i]);
myav = av_make(len, svs);
free(svs);
$result = newRV_noinc((SV*)myav);
sv_2mortal($result);
argvi++;
}
%typemap(ret) int * %{
free($1);
%}
%include "example.h"

example.h

#include <stdlib.h>
extern int *myfunction();

example.c

#include "example.h"

int *myfunction()
{
int *a = (int *) malloc( 5*sizeof(int) );
a[0] = 45;
a[1] = 4;
a[2] = 8;
a[3] = 9;
a[4] = 1;
return a;
}

测试.pl

use feature qw(say);
use strict;
use warnings;

use example;

my $arr = example::myfunction();

my $i = 0;
for ( @$arr ) {
say "$i: '$_'";
$i++;
}

编译(Ubuntu 16.10 与 perlbrew):

swig -perl5 example.i
perl_dir=~/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE
gcc -fpic -c example.c
gcc -fpic -c -Dbool=char -D_GNU_SOURCE -I"$perl_dir" example_wrap.c
gcc -shared example.o example_wrap.o -o example.so

运行

$ perl test.pl
0: '45'
1: '4'
2: '8'
3: '9'
4: '1'

关于c - SWIG typedef - 将数组返回给 Perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42277904/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com