gpt4 book ai didi

c - 将 C 函数导入 Perl 程序

转载 作者:太空狗 更新时间:2023-10-29 15:21:32 25 4
gpt4 key购买 nike

我想导入我写的 C 函数

#include <math.h>
#include <stdio.h>

double function (const double *restrict ARRAY1, const size_t ARRAY1_SIZE, const double *restrict ARRAY2, const size_t ARRAY2_SIZE) {//calculate a p-value based on an array
....
}
int main(){
....
}

进入 perl 脚本,我见过 Inline::C 和 XS,但我不知道如何使用它们,我无法完成这些示例,而且我还需要 lgamma 函数。该函数将 2 个数组作为输入。

谁能提供一个示例,说明我如何在导入 C 的 math.h 的同时将其导入 perl 脚本?

最佳答案

这个问题的棘手部分是将 double 组从 Perl 传递给 C。

一种方法是使用两个步骤。将 Perl 数组(C 中的 AV*)转换为 double 组,然后调用您的函数。此处使用的 perl 函数和宏记录在 perlguts

use Inline 'C';
@a = (1,2,3,4,5);
@b = (19,42);
$x = c_function(\@a,\@b);
print "Result: $x\n";
__END__
__C__
#include <stdio.h>
#include <math.h>
double *AV_to_doubleptr(AV *av, int *len)
{
*len = av_len(av) + 1;
double *array = malloc(sizeof(double) * *len);
int i;
for (i=0; i<*len; i++)
array[i] = SvNV( *av_fetch(av, i, 0) );
return array; /* returns length in len as side-effect */
}

double the_real_function(const double *x1, int n1, const double *x2, int n2)
{
...
}

double c_function(AV *av1, AV *av2)
{
int n1, n2;
double *x1 = AV_to_doubleptr(av1, &n1);
double *x2 = AV_to_doubleptr(av2, &n2);
double result = the_real_function(x1,n1, x2,n2);
free(x2);
free(x1);
return result;
}

关于c - 将 C 函数导入 Perl 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230854/

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