Raku: Как мне присвоить значения CArray [WCHAR]? - PullRequest
4 голосов
/ 07 января 2020

$ raku -v Это версия Rakudo 2019.07.1, построенная на версии MoarVM 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

1 Ответ

5 голосов
/ 07 января 2020

Проблема ясно указана в сообщении об ошибке: в том виде, в каком вы его объявляете, он ожидает, что каждый элемент будет 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 не совсем Positional, но для него определено AT-POS, так что вы можете использовать квадратные скобки для назначения значений. Ошибка возникает, когда вы пытаетесь присвоить неинициализированному Scalar (который содержит любой), как если бы это был массив. Минимальное изменение вашей программы - это просто инициализация CArray [WCHAR]:

```perl6
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)␤»
...