gpt4 book ai didi

c - perl xs 模块编写 - 使用同一个 xs 文件中的另一个函数

转载 作者:太空狗 更新时间:2023-10-29 16:00:41 24 4
gpt4 key购买 nike

我是 XS 的初学者,花了一些时间在网上寻找这个答案,但没有成功。问题是 XS 更改了函数的名称,当它进行编译时,我会得到一个 undefined reference 错误。例如考虑下面的 XS 代码:

size_t 
matrixIndex (colIndex, rowIndex,nCols,nRows)
size_t colIndex
size_t rowIndex
size_t nCols
size_t nRows
CODE:
size_t register i;
RETVAL = (rowIndex * nCols) + colIndex;
OUTPUT:
RETVAL

然后我尝试像这样在下面的函数中使用它

int
matrixCopyColumnVector_dbl (colIndex,fromMatrix,nColsMatrix,nRowsMatrix,intoVector,nRowsVector)
size_t colIndex
SV * fromMatrix
size_t nColsMatrix
size_t nRowsMatrix
SV * intoVector
size_t nRowsVector
CODE:
size_t register x, n;
if( nRowsVector != nRowsMatrix) { RETVAL = 0; return RETVAL; }
n = 0;
for(x=0; x<= nRowsMatrix; x++) {
intoVector[n] = fromMatrix[matrixIndex /*USE OF FUNCTION HERE!!*/(colIndex,x,nColsMatrix,nRowsMatrix)];
n++;
}
RETVAL = 1;
return RETVAL;
OUTPUT:
RETVAL

然后我运行 make 并完成编译过程,我在似乎是 undefined reference to 'matrixIndex' 的链接阶段收到错误。

所以我想知道从同一个 XS 文件中调用函数的标准 XS 方法是什么?

最佳答案

XS 代码创建 Perl 子程序。所以调用 XS 函数与 calling 相同任何其他 Perl 子程序。

与其处理这种复杂性和低效率,不如创建一个 C 函数而不是 Perl 子函数。 (如果需要,您可以使用 XS 独立公开该 C 函数。)

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

static UV matrixIndex(UV colIndex, UV rowIndex, UV nCols, UV nRows) {
return (rowIndex * nCols) + colIndex;
}

MODULE = Foo::Bar PACKAGE = Foo::Bar

int
matrixCopyColumnVector_dbl(colIndex, fromMatrix, nColsMatrix, nRowsMatrix, intoVector, nRowsVector)
UV colIndex
SV * fromMatrix
UV nColsMatrix
UV nRowsMatrix
SV * intoVector
UV nRowsVector
PREINIT:
UV register x, n;
CODE:
if (nRowsVector == nRowsMatrix) {
RETVAL = 0;
} else {
n = 0;
for (x=0; x<=nRowsMatrix; x++) {
intoVector[n] = fromMatrix[matrixIndex(colIndex, x, nColsMatrix, nRowsMatrix)];
n++;
}
RETVAL = 1;
}
OUTPUT:
RETVAL

您对return 的使用不正确。如果您想提前返回,请使用其中一个 XSRETURN* 宏。

fromMatrix[...]intoVector[...] 是完全错误的。 fromMatrixintoVector 是 C 数组。 (它们甚至不是 Perl 数组,这无关紧要。)

Perl 整数的大小为 IV(或 UV 表示无符号),不一定是 size_t。使用它们以获得最佳兼容性。

如果你想要可移植性,你不能假定 C99,所以你不能混合声明和代码。您需要将声明放在 PREINIT 中(或在 CODE 中使用 curl 来为变量声明创建新的范围)。

关于c - perl xs 模块编写 - 使用同一个 xs 文件中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569264/

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