Как создать `ffi_type`, который представляет массив AC?
typedef struct _StructWithCArray {
char a[3];
char b;
} StructWithCArray;
Я представляю a[3]
как struct
содержать три char
, но не получится на симуляторе iOS i386.
У кого-нибудь есть идеи, как с этим справиться?
Вот демо, чтобы показать ошибку. Вы должны использовать симулятор не новее, чем iPhone 5
запустить BugReport
проект и симулятор новее, чем iPhone 5
Кажется, в этом случае нет проблем.
3 ответа
libffi не имеет встроенного представления о типе массива, в первую очередь потому, что нет способа передать массив функции в C - он всегда затухает как указатель. Однако, как вы обнаружили, это не идеально, потому что вам все еще может потребоваться представить массив как элемент структуры. То есть это упущение в libffi.
Обходной путь для этого должен просто добавить один элемент в структуру для каждого элемента массива. В вашем случае вы бы добавили три char
поля. В целом это работает, потому что массив имеет такое же выравнивание, что и его элементы.
Документация libffi теперь явно упоминает этот подход.
Как насчет этого.
ffi_type* ffi_type_nullptr = 0;
ffi_type ffi_type_array;
ffi_type_array.alignment = ffi_type_uchar.alignment;
ffi_type_array.size = ffi_type_uchar.size * 3;
ffi_type_array.type = FFI_TYPE_STRUCT; // Trick.
ffi_type_array.elements = &ffi_type_nullptr; // Pointer to a null pointer.
ffi_type* members[2];
members[0] = & ffi_type_array;
members[1] = 0;
ffi_type ffi_type_T = {0, 0, FFI_TYPE_STRUCT, members};
Структура, содержащая 3 символа, - это не то же самое, что массив из 3 символов. Это даже небезопасно. Вам придется сделать
StructWithCArray swc;
swc.a[0] = s.c1;
swc.a[1] = s.c2;
swc.a[2] = s.c3;
Если вас не волнует, что код не переносимый и вы точно знаете, что структура памяти массива и структуры одинакова, вы можете использовать memcpy
скопировать 3 символа.