Я хотел бы создать массив различных структур с разными размерами.Упаковка объединения структур
Результирующий массив должен быть плотно упакован без нулевых значений между структурами.
Все это должно быть инициализировано во время компиляции, поэтому оно может находиться во вспышке встроенной системы.
Результатом является дерево дескрипторов конфигурации USB, каждый дескриптор упакован сразу после последнего, чтобы создать единую конфигурацию blob. Будут приветствоваться предложения о различных подходах к проблеме. http://www.beyondlogic.org/usbnutshell/usb5.shtml#ConfigurationDescriptors
struct a {
uint16_t some_field;
};
struct b {
uint32_t another_field;
};
union detail {
struct a a;
struct b b;
};
const union detail configuration[] = {
{ .a = { .some_field = 23 } },
{ .b = { .another_field = 12 } }
};
В приведенном выше примере это значительно упрощенной версии моей текущей, неисправная, попытка. Каждый элемент массива имеет размер самого большого члена объединения. Таким образом, каждый элемент массива имеет 32 бита, а первая запись дополняется нулями.
Выходной ток 1700 0000 0c00 0000
Желаемая выход 1700 0c00 0000
Существующие методы получения этого упаковано вывода использовать гигантский массив Uint8 с макросами, чтобы вставить более сложные значения, такие как 16-битных чисел. Массив структур более точно представляет данные и обеспечивает безопасность типов, если он будет работать.
Мне не нужно иметь возможность индексировать или получать доступ к данным из массива, а blob - в низкоуровневые подпрограммы USB. Игра с атрибутом gcc упакована не изменила поведение стандартного объединения.
Эта проблема является одной из причин, почему структуры/объединения не должны использоваться для сериализации. – user694733
Союзы не работают. – 2501
Спасибо за идеи о наличии одной большой структуры. К сожалению, полная структура зависит от конфигурации, одна конфигурация может иметь 1 конечную точку, другая может иметь три, где каждая конечная точка является другой структурой. GCC не поддерживает вложенные структуры с массивами переменной длины и делает их фиксированным размером побеждает повторное использование. – lod