问题标签 [nativecall]
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.
raku - 有什么方法可以列出 Raku 的本机接口中可用的函数和数据结构吗?
主要是为了创建合理的示例,我想知道哪些数据结构和函数可用于 Raku 的native
界面,如
有没有办法列出它们?我特别想获得C++函数和数据结构的例子,这样我就不必创建和编译外部库来创建一个例子。
raku - 在 Perl 6 中,如何使用 NativeCall 接口将原始字节转换为浮点?
从Perl 6 IRC 频道中的此对话和 Martin Barth 发布的问题中,我正在尝试使用用于该目的的 Perl6 NativeCall 接口重现此 C 代码。这是我尝试过的:
这会产生一个错误:
我将其解释为,您已将其声明为整数,我无法将其转换为原始内存,以便可以将其从这里复制到那里。
这只是回答 Martin Barth 提出的更一般性问题的一种可能方式:如何将原始字节转换为浮点数。也许还有其他方法可以做到这一点,但无论如何我都很想知道如何将 C 程序转换为 NativeCall 等价物。
更新:与此同时,这是另一篇文章试图解决的原始问题。
raku - 本机 localtime() 段错误
localtime
在尝试公开Perl 6 中的功能时,我似乎做错了什么:
在 下运行perl6-lldb-m
,我得到:
我在这里做错了什么明显的事情吗?
更新:最终的工作解决方案:
c - 如何将用户数据传递给回调函数
我正在开发一个 NativeCall 接口;有一个接受回调的 C 函数,定义为:
我的第一反应是:
但是当调用这个函数时会产生一个错误:
如果我忽略 user_data 参数,一切正常,所以声明的其余部分都很好:我只是没有将任何额外的数据传递给回调函数。
在其他情况下,我使用 Buf 将(可能)二进制数据块传递给 C 函数并且它起作用了;这里的区别是回调函数。知道如何解决这个问题吗?
(使用 perl6 2018.03)
c - 使用 NativeCall 在不同平台上处理 C typedef
是否有一种方便的方法来处理在不同平台上可能具有不同价值的 C typedef?
例如
目前我正在像这样在 Perl 6 中处理这个
raku - perl 6上的三指针本机调用
我尝试用 perl6 包装 sd-bus,但是函数调用三重指针有问题。
来自 sd-bus.h
尝试本地调用
我打电话,但我不知道如何取消对 array(@) 获取和可激活变量的引用。
谢谢,对不起我的英语
[编辑]
dwarring 回复解决了我对 derefencies Pointer[CArray[Str]] 的问题
这是一个测试代码:
raku - 如何在 Perl 6 中声明固定大小的原生数组?
我正在尝试在 Perl 6 中声明以下 C 结构:
我的问题是我不知道如何int A[2];
使用内置的 NativeCall api 声明该部分。
所以我所拥有的是:
但是,我知道该has CArray[int32] $.A;
部分是错误的,因为它没有在我的结构中声明仅占用 2 个int32
大小的部分。
raku - 使用 NativeCall 将 CStruct 中的内联 CArray 传递给共享库
这是“如何在 Perl 6 中声明固定大小的原生数组? ”的后续问题。
在那个问题中,讨论了如何将固定大小的数组合并到CStruct
. 在这个答案中,建议使用HAS
内联 aCArray
在CStruct
. 当我测试这个想法时,我遇到了一些奇怪的行为,在问题下方的评论部分无法解决,所以我决定将它写成一个新问题。这是我的 C 测试库代码:
slib.c:
要从中生成共享库,我使用了:
然后,Perl 6 代码:
p.p6:
脚本的输出是:
问题:
为什么
nativesizeof( $s )
给出 24(而不是 20 的期望值)?为什么
B
从 C 函数打印时结构中的数组内容与预期不符?
注意:
我正在使用 Ubuntu 18.04 和 Perl 6 Rakudo 版本 2018.04.01,但也使用版本 2018.05 进行了测试
raku - 从本机指针中获取数据
将数据放入 Perl 6 Native 指针中没什么大不了的:
但是,我认为Pointer[int]
除了创建一个函数来完成它之外,没有其他方法可以让它们脱离出来,因为nativecast
显然是在相反的方向上工作,或者至少不是在强制转换为非本地类型的方向上(这应该是显而易见的姓名)。你会怎么做?
更新:例如,使用 Array 会使它更可行。然而
这有效,但会产生错误:Don't know how many elements a C array returned from a library
更新 2:根据Christoph 的回答(谢谢!),我们可以对此进行详细说明,我们可以将这些值放回Buf
我们需要将指针转换为与缓冲区使用的完全相同的类型,然后我们使用指针算法来运行它。但是,我们习惯于$blob.bytes
知道何时结束循环,这仍然有点 hacky。有没有更直接的方法?或者只是一种使用 Bufs/Blobs 的方式,以便可以轻松地将它们复制到 Native 领域并返回?
raku - 在 NativeCall perl6 模块中声明指针 [void] 的奇怪消息
这些代码片段可能看起来很奇怪,这是因为我从我的原始代码开始并切断了部分,直到我到达重现错误的最小指令集。所以忍受表面上的无用。有两个 perl6 模块,一个use
是另一个,一个是程序。这是第一个模块:
第二个模块包含在第一个模块中,但实际上没有使用它的任何部分:
程序创建一个 test1 对象并调用测试方法:
该程序输出一个错误,显然是由类 test1 的方法 test 中的赋值引起的:
如果我在第二个类中注释掉$.wrongdoer
,程序执行没有错误。我正在运行 rakudo 2018.06。这是 NativeCall 模块中的错误还是我看不到的其他错误?