gpt4 book ai didi

perl - 如何将数组传递给 Perl XS 中的 C 函数?

转载 作者:行者123 更新时间:2023-12-04 03:06:03 27 4
gpt4 key购买 nike

如何通过引用 C XS 模块来传递 Perl 数组?

my @array = ( 1..20 );

XSTEST::test_array_passing(\@array);

我在 XS 中该怎么做才能看到数组?

最佳答案

XS 可以以 AV* 形式接收对 ARRAY 的引用。或 SV* .后者必须取消引用到 AV* .

use Inline C => DATA;
@array = (1 .. 20);
$r = sum_of_elements1(\@array);
$s = sum_of_elements2(\@array);
print "$r $s\n"; # produces output: "210 210\n"
__END__
__C__
double sum_of_elements1(AV* array)
{
int i;
double sum = 0.0;
for (i=0; i<=av_len(array); i++) {
SV** elem = av_fetch(array, i, 0);
if (elem != NULL)
sum += SvNV(*elem);
}
return sum;
}

double sum_of_elements2(SV* array_ref)
{
AV* array;
if (!SvROK(array_ref) || SvTYPE(SvRV(array_ref)) != SVt_PVAV)
croak("expected ARRAY ref");
array = (AV*) SvRV(array_ref);
return sum_of_elements1(array);
}

此代码生成的 .xs 文件声明:
double
sum_of_elements1 (array_ref)
SV * array_ref

double
sum_of_elements2 (array)
AV * array

编辑:在 sum_of_element2() ,添加了 *SV 是对数组的引用的检查。

关于perl - 如何将数组传递给 Perl XS 中的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1503763/

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