我该如何进行这项工作?
更新:在搜索了包含 Raku 规范测试的 Github 之后,在这里,我没有找到任何传递 CArray[of-structs] 的示例。 这里有 Christoph 2017 年发表的一篇文章,其中给出了“解决方法”。
Christoph 的解决方案可能有效,但在 NativeCall 中会更好,如果没有更好的办法的话。
在 Github 上有一个使用 a 的 Rakudo 测试,int TakeAStructArray(Struct **structs)
如果您可以编写一个 C 函数将其 args 重新打包以转发到 a ,这可能会有所帮助TakeAnArrayOfStruct( struct Struct[])
。
下面,JJMerelo 对我的怀疑是由于 Rakudo 中的错误而失败。
我有一个C函数,它使用类似于 NativeCall 文档中使用的 timespec 结构:
结构 TS {
int show2( struct TS ts[2] ) { printf("show2: (1) %ld %ld (2) %ld %ld\n", ts[0].ot, ts[0].one, ts[ 1].ot, ts[1].one); 返回0;从C调用时效果很好。
从 Raku (moar) 调用不起作用:
class TS is repr('CStruct') {
has long $.ot;
has long $.one;
}
sub show2( CArray[TS] --> int32) is native(
'/home/rir/Raku/try-CArray/libshow.so'
) {*}
my $A = CArray[TS].new;
$A[1] = TS.new( :ot(50), :one(60));
$A[0] = TS.new( :ot(30), :one(40));
show2( $A);
say " s/b 30 40 50 60\n";
没有错误,结果如下:
show2: (1) 94658691693328 94658695469968 (2) 0 0
s/b 30 40 50 60
类似的功能int show2long( long i[2] )
和int showTS(int show1( struct TS *ts )
工作。