问题标签 [xs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - 如何在使用 XS 的 Perl 程序中使用 Ada 模块?
我最近开始学习 Ada 并且知道 Ada 和 C 目标文件可以链接在一起以构建多语言程序或库,是否可以使用 XS 从 Perl 调用 Ada 代码?
c - Perl XS:对象的转储值是什么意思 - t_obj 是 - $VAR1 = bless( do{\(my $o = 41032464)}, 'Math::Test1' );
我尝试使用 Perl XS 编写使用 C API 的 perl 代码。我得到对象的转储输出为 -
t_obj 是 - $VAR1 = bless(do{(my $o = 41032464)}, 'Math::Test1' );
我编写了一个名为 Math::Test1 的简单库用于练习,尽管我的模块与此不同且更复杂。
看起来从 perl 到 C 的转换很好,但是当我将数据从 C 中返回到 perl 时,数据处于这种令人困惑的形式,而我期望对象的属性带有一些附加信息。
粘贴我的代码 -
测试1.xs
类型图
数学/Test1.pm
t/t.pl(测试文件)
输出
==========CONSTRUCTOR=========
结构成员是 5 和 4
t_obj 是 - $VAR1 = bless( do{(my $o = 29924112)}, 'Math::Test1 ');
==========显示=========
初始化:节
号为 5 和 4
代码:节
==========添加======== =
加法是 9
我关心的是为什么对象有 bless(do{(my $o = 29924112)}, 'Math::Test1');
我是否错误地解释了输出或 typemap OUTPUT 部分需要更正。
请就此提出您的建议。
perl - 为什么 sv_setref_pv() 将其 void * 参数存储在 IV 槽中?
在查看 Perl API 时,我想知道为什么
sv_setref_iv()
将其IV
参数存储在IV
插槽中,sv_setref_nv()
将其NV
参数存储在NV
插槽中,- 但是
sv_setref_pv()
将其void *
参数存储在IV
插槽中,而不是PV
插槽中?
我有一种预感(CUR 和 LEN 字段对于这样的变量没有意义),但我想听听懂 XS 的人的意见 :-)
perl - 使用 ExtUtils::Constants 访问系统常量
我正在尝试使用 ExtUtils::Constant 从系统头文件中导出 C 常量。
根据文档,我在 Makefile.PL 中有:
然后在 Bar.xs 中:
但是,当我运行测试时:
我得到:
如果 EPOLLOUT 作为常数存在,情况就不是这样了;即它是一个无效的标识符。
这应该怎么做?我一点也不惊讶这未能将 EPOLLOUT 设置为正确的值——文档还说 ExtUtils::Constant “不包含扫描头文件以提取这些常量的例程”——但是.xs
生成的代码已经结束我的头,我有点惊讶 Foo::Bar::EPOLLOUT 没有被识别为具有 undef 值的标识符,而且它没有让我对下一步尝试什么感到困惑。
我会考虑另一个使用 ExtUtils::Constant 的 perl 模块的来源,但我能想到的唯一一个导出系统定义的是 POSIX,它是核心(如果其他人知道,请发表评论)。
24 小时后:现在交叉发布在Perl Monks上。
perl - 如何子类化 DBI 以隐藏用户凭据?
我想对模块进行子类化以使用 C 代码DBI
隐藏子例程。connect
例如,我有:
我想编写一些调用上述子例程并在 Perl 中DBI->connect
返回句柄的 C 代码。$dbh
是否可以这样做,如果可以,有人可以提供一个例子或指出一些来源吗?
c - 调用带参数的 perl 例程
我需要在我的 C 程序中调用 perl 例程。perl 例程采用以下参数:$a, $b, $c
,其中$a
和$b
是整数,$c
是字符串(可能包含二进制字符)。根据perlcall,这是拨打电话的方法。
好像只能用call_argv(...),但是有两个问题
- 如何将整数传递给 perl 例程
- 如何将(二进制)字符串传递给perl?
希望有这样的功能
c++ - 如何使用 XS 接口 c++ 和 perl?
这是学校的事情。
这是问题所在:
我们正在开发一个炸弹人克隆,我们必须实现一个脚本界面,允许用户制作自己的“人工智能”。我们选择使用 Perl。现在,我像这样构建 perl 模块:
以下是文件(测试目的):
SaibApi.xs:
SaibApi.hpp
Makefike.PL:
为清楚起见,我排除了类型映射文件。
该模块已正确构建,我能够在 perl 中实例化 SaibApi 类。现在我们的问题是,显然没有办法同时在 c++ 和 perl 中实例化该类。我们试图做的是给用户一个简单的 API,允许通过简单的方法从我们的 C++ 代码中获取对象(很多 std::list 包含地图、玩家等......)。
例如:
我们做了很多研究,但是关于 XS 的文档有点稀缺。我们现在被困住了。如何同时在 c++ 和 perl 中实例化类,允许_lol
在 c++ 部分中设置并在 perl 部分中打印它而无需使用该SetLol()
方法?如果不可能,还有什么选择?
perl - 在 Perl 中加载 DLL
我有一个给定的 32 位 DLL(dds.dll)和一个头文件(dds.h,C++ 风格)。我确实有来源,但我不想更改它。我在使用 cygwin 的 Windows 上。
我想通过 XS 访问 DLL 中的函数,而不是直接通过 Perl。我是 XS 的新手。
[我不知道如何使用Win32::API
. DLL 函数具有结构输入和*struct
输入(后者被函数修改),我不知道Win32::API::Struct
. 我想这也是一种方法,但我现在已经放弃了。]
我可以在 Perl 和 XS 之间传递整数列表,这样那部分就可以工作了。我的计划是#include "dll.h"
在 XS 代码中传入整数的平面列表,将列表转换为 XS 中的结构,将结构和其他参数传递给 DLL 函数,将生成的结构转换为整数的平面列表,然后返回Perl 的列表。
我已将 XSLoader.pm 减少到我需要的最低限度,部分是为了了解发生了什么。它适用于我自己的 XS 生成的 .dll。
我试过以同样的方式加载 dds.dll,但实际上我认为它没有意义。我过去了dl_require_symbols
,dl_undef_symbols()
也可以。然后dl_find_symbol looks
对于某种启动符号并没有找到它。我想 XS 创建了一个引导函数,它使 Perl 通过 可以看到 XS 函数dl_install_xsub()
,但是普通的 DLL 没有这个。
无论如何,我不想让 dds.dll 函数在 Perl 中直接可见。我想让 dds.dll 函数对 XS 代码可见。这听起来像一个简单的链接步骤,但我无法弄清楚。
如果有更简单的方法,我也赞成。任何帮助表示赞赏。
xs - XS PPCODE 不正常
我正在使用 XS 在 Windows 上的 Cygwin 下使用 g++ 从我的 Perl 项目中调用第三方 DLL。其中一个 DLL 函数将结构作为参数,并以指向结构的指针的形式返回其主要结果。现在我传入一个包含 28 个整数的平面列表并填充第一个结构。然后我调用该函数。然后我想将生成的结构展平为最多 54 个整数的列表。
(这看起来像很多整数,但DLL函数相当复杂,需要很长时间才能运行,所以我认为值得。除非有人有更好的主意?)
这是接近工作。我可以说结果大多是明智的。但是有两个奇怪的问题。
当我打印出相同的变量时,我会得到不同的结果,具体取决于它是否在“for”循环中!我在下面展示这个。我已经盯着这个很久了。
一旦我到达第一个 XPUSH,我就会得到“内存不足”。
这是XS代码。
这是DLL头文件的相关部分。
这是输出。返回码没问题。节点和卡不是。如果你眯着眼睛,你可能会注意到 0 和 768 也出现在输出表中,所以可能存在某种偏移。
第一个奇怪的是,主表前后的两个'0'行与主表中的'0'行不同。但是,主表中的数据与预期的一样,包括第 10-12 行中的垃圾。
第二个问题是 XPUSH 没有按预期工作。
perl - exposing c function on perl using XS
I have multiple c functions on this format :
where int
is the return type;
result[]
contains string which the function fill
what is the best to write such function as XS and expose it on perl to:
get the return value of the function
get the char result[] value on perl
I tried the below but the below only return the return value
Any help will be appreciated ?