$ raku -v 这是基于 MoarVM 版本 2019.07.1 构建的 Rakudo 版本 2019.07.1
以下是在 Raku REPL 上完成的。我在这里做错了什么?如何为 CArray[WCHAR] 赋值?
我希望 $lpData[0] 为 0xABCD,$lpData[1] 为 0xEF12。
> use NativeCall;
Nil
> constant WCHAR := uint16;
(uint16)
> my $ValueData = 0xABCDEF12;
2882400018
> my CArray[WCHAR] $lpData;
(CArray[uint16])
> $lpData[ 0 ] = ( $ValueData +& 0xFFFF0000 ) +> 0x10;
Type check failed in assignment to $lpData; expected NativeCall::Types::CArray[uint16] but got Array ($[])
in block <unit> at <unknown file> line 1
> $lpData[ 1 ] = $ValueData +& 0x0000FFFF;
Type check failed in assignment to $lpData; expected NativeCall::Types::CArray[uint16] but got Array ($[])
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
非常感谢,-T
错误消息中清楚地说明了问题:在您声明它的方式中,它期望每个项目都是 CArray[WCHAR]。以这种方式声明,如文档中所示:
use NativeCall;
constant WCHAR = uint16; # No need to bind here also
my $native-array = CArray[WCHAR].new();
$native-array[0] = 0xABCDEF12 +& 0x0000FFFF;
say $native-array.list; # OUTPUT: «(-4334)?»
Run Code Online (Sandbox Code Playgroud)
CArray不完全是 a Positional,但它确实已AT-POS定义,因此您可以使用方括号来分配值。当您尝试分配一个未初始化的Scalar(包含任何)时,就会出现错误,就好像它是一个数组一样。程序的最小变化只是初始化为 CArray[WCHAR]:
use NativeCall;
constant WCHAR = uint16; # No need to bind here also
my CArray[WCHAR] $native-array .= new;
$native-array[0] = 0xABCDEF12 +& 0x0000FFFF;
say $native-array.list; # OUTPUT: «(-4334)?»
Run Code Online (Sandbox Code Playgroud)