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

2024-02-26

我是 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,nColsMatrix,nRowsMatrix)];
         n++;
      }
      RETVAL = 1;
      return RETVAL;
    OUTPUT:
       RETVAL

然后我跑make它经历了编译过程,我在似乎是链接阶段得到了一个错误undefined reference to 'matrixIndex'.

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


XS代码创建Perl潜艇。所以调用 XS 函数与calling https://perldoc.perl.org/perlcall.html任何其他 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* macros.

fromMatrix[...] and intoVector[...]是完全错误的。fromMatrix and intoVector是 C 数组。 (它们甚至不是 Perl 数组,但这并不相关。)

Perl 整数的大小IV (or UV对于无符号),不一定size_t。使用它们以获得最佳兼容性。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 用于 ASP.NET Core 应用程序生产的 Kestrel 准备好了吗?

    我有一个在 asp net core 2 0 中开发的角度应用程序使用的 api 它已部署在 IIS 中并配置为使用 kestrel 我读到 Kestrel 在公开公开应用程序时并不安全等等 真的吗 Kestrel 还没有准备好用于生产吗
  • C++ 正则表达式解析嵌套结构

    我有一个永久格式如下的字符串 First nested string Second nested string 嵌套可以是任意深度 每个子元素都采用右大括号的格式 在上一层嵌套和右大括号的基础上添加两个空格 我想接收允许获取嵌套数据的正则表
  • 使用 WebCrypto API 生成 RSA 密钥对并使用密码保护它

    标题说明了一切 我想知道如何使用 WebCrypto API 生成 RSA 密钥对 以及如何使用密码保护它 以便将其存储在数据库中 You can 使用 WebCrypto 生成 RSA 密钥对并将其导出如 jwk Json Web 密钥
  • Spark 中的类型安全配置

    我已经在 Spark 应用程序中定义了一个默认配置 该配置位于src main resources reference conf I use ConfigFactory load 来获取配置 当我运行应用程序时spark submit它采用
  • 双Python for循环的numpy向量化

    V 是 n p numpy 数组 通常维度为 n 10 p 20000 我现在的代码看起来像 A np zeros p for i in xrange n for j in xrange i 1 A F i j V i V j 我将如何重写
  • Xpath 选择祖先

    我试图找到一个公式 根据元素在 XML 层次结构中的位置为该元素创建 URL 这是我的示例 xml
  • HttpContent 边界双引号

    我有这个代码示例 它是作为另一个问题的答案发布的 使用 C 通过 HTTP POST 发送文件 https stackoverflow com questions 1131425 send a file via http post with
  • 如何使用jquery查找表中行的索引

    我正在尝试查找表中一行的索引 我正在尝试使用以下代码 但我似乎得到的索引为 1 document ready function tr click function var index table index this span text T
  • 在 Javascript 中将 GMT 日期/时间转换为 EST

    在 Javascript 中 无论用户设置如何 如何将 GMT 中的日期 时间转换为 EST var tmpDate New Date enter any valid Date format here JavaScriptDate http
  • 如何证明一个函数有效?

    我最近开始信奉测试 并主要从单元测试开始 我编写单元测试来说明函数在某些情况下工作 特别是使用我正在使用的确切输入 我可能会做一些单元测试来练习该功能 不过 除了该函数在我测试过的场景下达到了我预期的效果之外 我实际上还没有证明任何其他东西
  • 从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?

    我已将 VS2010 中当前针对 NET 4 0 的解决方案迁移到 VS2012 现在我想将其重新定位到 Net 4 5 我不确定的是 NuGet 包 例如 我在 VS2010 中从 EF4 更新的 EF5 实际上是 EF 4 4 如下所示
  • Redirect 和 RewriteRule 一起使用时的 .htaccess 重定向循环

    我正在 HTACCESS 文件中尝试以下操作 我想要 301 重定向 gt http www domain com somepage php page foo http www domain com somepage php page fo
  • Google App脚本更新另一张工作表中的单元格值

    我对这个有点卡住了 我试图在更新另一个电子表格的第一列后找到相应的行并更新另一个谷歌电子表格中的最后一列 当用户在电子表格 X 的 ColA 中选择 重新进货 时 我需要在另一张工作表 Y 上的 ColB 中查找 ID 值 然后我需要访问电
  • 如何获取 websocket 端点内的 cookie 值

    我在我的应用程序中使用基于 JavaEE 7 的 Websocket API 我需要访问 websocket 端点内 cookie 中设置的值 Annotated one ServerEndpoint websocket 我该怎么做呢 on
  • Android:如何制作默认拨号器应用程序?

    今天我的应用遭到 Google 拒绝面对面通话 https play google com store apps details id com gazman beep 在按照策略要求请求相关权限之前 您的应用程序似乎不会提示用户成为默认处理
  • 找到最小值/谷点并获取 R 中谷点开始和谷点结束的索引

    我对统计和 R 有点陌生 我需要找到峰值和谷值以及峰值 谷值开始和结束的索引 对于 Maxima peak 我得到了 findPeaks 函数 它可以帮助我满足峰值要求 但是我无法找到任何软件包来查找适合我的要求的谷点 以下是用于查找峰值的
  • 加载tensorflow模型而不导入tensorflow

    是否可以训练张量流模型 然后将其导出为无需张量流即可访问的模型 我想将一些机器学习应用到一个学校项目中 其中代码在在线门户上提交 但它没有安装张量流 只有标准库 我可以上传其他文件 但任何 TensorFlow 文件都需要 TensorFl
  • 什么是网络线程?

    由于一些自身引起的问题 我的 iPhone 应用程序崩溃并收到以下错误 Tried to obtain the web lock from a thread other than the main thread or the web thr
  • GraphQL 查询从 GitHub 存储库获取文件信息

    我想使用 GitHub 存储库来存放我的 Gatsby 网站中的帖子 现在我正在使用两个查询 首先是获取文件的名称 viewer repository name repository name object expression maste
  • perl xs 模块编写 - 使用同一 xs 文件中的另一个函数

    我是 XS 的初学者 花了一些时间在网上寻找这个答案 但没有运气 问题是 XS 更改了函数的名称 当它进行编译时 我会得到一个未定义的引用错误 例如 考虑下面的 XS 代码 size t matrixIndex colIndex rowIn