4

$ 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

非常感谢,-T

4

1 回答 1

5

错误消息中清楚地说明了问题:在您声明它的方式中,它期望每个项目都是 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)␤»

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)␤»
于 2020-01-07T06:29:51.810 回答