我该怎么做?
更新:在搜索Github(包括Raku规范测试)之后,在这里,我没有找到任何通过CArray(结构)的例子。下面是Christoph在2017年发表的一篇文章,其中给出了一个“解决方案”。
克里斯托夫的解决方案可能有效,但如果没有更好的办法,在NativeCall中效果会更好。
在Github上有一个Rakudo测试,它使用了int TakeAStructArray(Struct**structs)
,如果您可以编写一个C函数来重新打包其参数以转发到TakeAnArrayOfStruct(Struct Struct[])
,这可能会有所帮助。
下面,jjmerlo反驳了我的怀疑,这是由于Rakudo中的一个bug导致的。
我有一个C函数,它使用的timespec结构与NativeCall文档中使用的结构类似:
结构TS{
int show 2(结构TS ts[2]){printf("show 2:(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
模拟html" target="_blank">函数intshow2long(long i[2])
和intshowts(intshow1(struct TS*TS)
工作。
不久前我遇到了这个问题,这迫使我写了一个解决方案
简而言之,NativeCall还不支持这一点。
长篇回答:如上所述,有一个变通方法。如果你不想浏览我的代码,答案归结为:
使用指针
。
或者,更好的是,一个Buf,然后使用NativeCall::Blob的指针到
。
然后,您将使用以下例程作为位置对象访问图元:
# Cribbed from MySQL::Native. Thanks, ctilmes!
method AT-POS(Int $field) {
nativecast(
T,
Pointer.new( $!b + $field * nativesizeof(T) )
)
}
和下面的方法在适当的索引处分配结构
method bind (Int() $pos, T $elem) {
my uint64 $p = $pos;
memcpy(
Pointer.new( $!b + $p * nativesizeof(T) ),
nativecast(Pointer, $elem),
nativesizeof(T)
);
}
因此,这种东西的基本实现是:
use NativeHelper::Blob;
class TypedBuffer {
has Buf $!b;
submethod BUILD ( :@array-of-structs ) {
# Assumes that array contains homogeneous struct values!
$!b = Buf.allocate(
@array-of-structs.elems * nativesizeof( @a[0].WHAT )
)
}
method new (@array-of-structs) {
self.bless( :@array-of-structs);
}
method bind (Int() $pos, T $elem) {
my uint64 $p = $pos;
memcpy(
Pointer.new( $!b + $p * nativesizeof(T) ),
nativecast(Pointer, $elem),
nativesizeof(T)
);
}
method AT-POS(Int $field) {
nativecast(
T,
Pointer.new( $!b + $field * nativesizeof(T) )
)
}
method Pointer {
pointer-to($!b);
}
}
基本用途是:
my $aos = TypedBuffer.new(@array-of-structs); # Init
my $struct = $aos[0]; # Retrieve first element
$aos.bind(2, $new-struct); # Replace third element
my-c-func($aos.Pointer); # Make call to a C Function
...下面的类是骆驼处理器,它最终被调用: 我知道Apache CXF使用的Exchange类与Camel使用的Exchange不同,但是这两种集成技术之间应该有一种传递信息的方式?
我创建了一个新的电子应用程序。 在索引中。jsi使用节点文件系统加载数据 如果我试着使用require。JSIT之所以能够工作,是因为它运行在不同的线程上,而不是使用节点进行初始化,更像是一个实际的浏览器窗口。但有没有办法从索引中传递数据呢。js到main。js 我不知道我对这个问题的看法是否部分正确 如果您需要更多代码或信息,请询问!
因此,我想要做的是使用Gradle运行我的Java应用程序,但也要将一个。csv&.xml文件传递给我的主类,以便在我的bufferedReader中使用它们&我不知道应该怎么做。我的应用程序不是构建到jar,它应该是用gradle运行任务运行的。我希望用户能够指定他们自己要使用的xml和csv文件(在命令行中),然后运行Java应用程序,而不是询问应用程序中文件的路径。例如,让我们使用这行代码:
问题内容: 背景: 我创建了一个非常简单的前端,用户可以在其中输入字符串。输入并单击“检查”按钮后,我想将此字符串作为JSON传递给python字符串,它将在其中进行SQL查找。根据SQL外观,python脚本应传递一个布尔值,该值应更改?到✔或✘。 题: 一旦按下“检查”按钮作为JSON到Python脚本,然后如何将字符串从Python传递到HTML,将?更改为✔或✘,如何传递字符串? 研究:
问题内容: 我需要在单击recyclerview的图像时将数据从传递 到 。有人可以帮忙吗? 问题答案: 创建一个侦听器接口,然后让您的MainActivity实现它。这样,您可以在onClick方法中调用回调方法。 接口: 主要活动: 您的VideoAdapter:
问题内容: 我有一个一个的按钮在我的课,这是我的主要窗口类: 我有一个类就是主窗口的内容。 如何访问内容中的此按钮?有没有更好的方法来组织和控制器以促进此访问? 问题答案: 这样使用委托怎么样?本示例将更改按钮的标题。