perl xs模块写入 – 在同一个xs文件中使用另一个函数

我是XS的初学者,花了一些时间在网上寻找这个答案而没有运气.问题是XS更改了函数名称,当它进行编译时,我将得到一个未定义的引用错误.例如,考虑下面的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,nRowsMatrix)];
         n++;
      }
      RETVAL = 1;
      return RETVAL;
    OUTPUT:
       RETVAL

我然后运行make并且它经历了编译过程,并且在看起来是未定义引用’matrixIndex’的链接阶段时出现错误.

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

解决方法

XS代码创建Perl subs.所以调用XS函数calling任何其他Perl子函数相同.

而不是处理这种复杂性和低效率,而不是创建一个C函数而不是Perl sub. (如果需要,可以使用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,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,nRowsMatrix)];
            n++;
        }
        RETVAL = 1;
    }
OUTPUT:
    RETVAL

您对退货的使用不正确.如果要提前返回,请使用其中一个XSRETURN *宏.

fromMatrix […]和intoVector […]是完全错误的. fromMatrix和intoVector是C数组. (它们甚至不是Perl数组,也不是相关的.)

Perl整数的大小为IV(或UV为unsigned),不一定是size_t.使用它们以获得最佳兼容性

如果你想要可移植性,你不能假设C99,所以你不能混合声明和代码.您需要在PREINIT中放置声明(或在CODE中使用curlies为变量声明创建新的作用域).

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...