Объявление массива внутри 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);
    }
}

Об этом здесь немного позже ответили. Он использует "встроенный" имеет == HAS для объявления массива собственных элементов, который затем преобразуется в CArray.

Другие вопросы по тегам