Объявление массива внутри Perl 6 NativeCall CStruct
Есть ли способ объявить массив объектов внутри CStruct?
struct my_struct {
int foo;
int bar;
char somestring[80];
};
class My::Struct is repr('CStruct') {
has int32 $.foo;
has int32 $.bar;
???
}
CArray[uint8]
будет char *
указатель, фактически не резервирующий пространство внутри структуры.
Вместо My::Struct.new
Я мог бы сделать память сам (вместо My::Struct.new()
Я использую buf8.allocate(xxx)
и держите ручку, чтобы GC не пожинал ее, nativecast
это к My::Struct), затем я должен использовать указатель math, чтобы найти строку внутри структуры и т. д., но, похоже, должен быть более простой способ.
Даже если бы он не был полностью реализован, простой способ сказать "Поместите 80 байтов здесь и вот указатель на это" был бы очень хорош.
1 ответ
Вот мой уродливый обходной путь:
class My::Struct is repr('CStruct') {
has int32 $.foo is rw;
has int32 $.bar is rw;
has int64 $.h0; # 10 int64s = 80 bytes
has int64 $.h1;
has int64 $.h2;
has int64 $.h3;
has int64 $.h4;
has int64 $.h5;
has int64 $.h6;
has int64 $.h7;
has int64 $.h8;
has int64 $.h9;
method somestring {
nativecast(Str, Pointer.new(nativecast(Pointer, self)+8))
}
sub strcpy(Pointer, Blob, --> Pointer) is native {}
method set-somestring(Str:D $s) {
my $buf = "$s\0".encode;
die "too long" if $buf.bytes > 80;
strcpy(Pointer.new(nativecast(Pointer, self)+8), $buf);
}
}