Здравствуйте, Volodkya, Вы писали:
V>Туплю...не могу понять почему.
Это нестандартное майкрософтовское расширение для языка.
Массив может быть так объявлен, если он — последний элемент в структуре.
Удобнее трактовать данные, которые лежат *после* структуры в памяти как часть массива.
Здравствуйте, 0x7be, Вы писали:
0>Здравствуйте, Volodkya, Вы писали:
V>>Туплю...не могу понять почему. 0>Это нестандартное майкрософтовское расширение для языка. 0>Массив может быть так объявлен, если он — последний элемент в структуре. 0>Удобнее трактовать данные, которые лежат *после* структуры в памяти как часть массива.
Здравствуйте, Volodkya, Вы писали:
V>Здравствуйте, 0x7be, Вы писали:
0>>Здравствуйте, Volodkya, Вы писали:
V>>>Туплю...не могу понять почему. 0>>Это нестандартное майкрософтовское расширение для языка. 0>>Массив может быть так объявлен, если он — последний элемент в структуре. 0>>Удобнее трактовать данные, которые лежат *после* структуры в памяти как часть массива.
V>Спасибо! А как работать с такой структурой?...
Я имею в виду как отвести память под массив снова?
Преобразования не проходят или я неверно преобразовавыю.
Здравствуйте, Volodkya, Вы писали:
V>>Спасибо! А как работать с такой структурой?...
V>Я имею в виду как отвести память под массив снова? V>Преобразования не проходят или я неверно преобразовавыю.
Судя по всему, эта структура — заголовок пакета. Данные обычно следуют за заголовком непрерывно.
Тогда, если у тебя данных N байт, то выделяешь любым способом блок размером (N + sizeof(QPacket)),
кастишь его к указателю на QPacket, ну и работаешь.
std::vector<char> fufel(N + sizeof(QPacket), 0);
QPacket* pPacket = (QPacket*)&fufel[0];
for(int i = 0; i < N; ++i)
pPacket->data[i] = bla-bla-bla;
Как-то так...
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Volodkya, Вы писали:
V>>>Спасибо! А как работать с такой структурой?...
V>>Я имею в виду как отвести память под массив снова? V>>Преобразования не проходят или я неверно преобразовавыю.
SVZ>Судя по всему, эта структура — заголовок пакета. Данные обычно следуют за заголовком непрерывно. SVZ>Тогда, если у тебя данных N байт, то выделяешь любым способом блок размером (N + sizeof(QPacket)), SVZ>кастишь его к указателю на QPacket, ну и работаешь.
SVZ>
Здравствуйте, Kernan, Вы писали:
K>Лучше так не делать, можно отхватить на выравнивании.
Не будет тут проблем с выравниванием, если структура описана корректно. Корректно же означает, что массив без размерности выровнен на sizeof его элемента
struct S
{
int N;
unsigned data[];
};
В данном случае data имеет смещение 4, а поэтому выравнивание в порядке, то есть все остальные элементы массива тоже выровнены на 4.
А вот так нехорошо
struct S
{
short N;
unsigned data[];
};
поскольку data выровнен на 2, а не на 4.
В любом случае выровненность любого элемента этого массива, сколько бы их не было, такая же, как и у нулевого (то есть у описания). Но это условие должно быть выполнено всегда, даже если массив с размером. Так что есть размер или его нет — в плане выравнивания ни на что не влияет.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А вот так нехорошо
PD>struct S PD>{ PD> short N; PD> unsigned data[]; PD>};
PD>поскольку data выровнен на 2, а не на 4.
На самом деле мы не можем сказать, на что будет здесь выровнен data. Ведь выравнивание определяется платформой, настройками проекта... Согласен?
Опять же, #pragma pack можно применить...
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Pavel Dvorkin, Вы писали:
SVZ>На самом деле мы не можем сказать, на что будет здесь выровнен data. Ведь выравнивание определяется платформой, настройками проекта... Согласен?
Независимо от того, на что выровнен data, все элементы этого массива выровнны на то же самое. Поэтому выделение памяти под N элементов этого массива никак не повлияет на выровненность.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Независимо от того, на что выровнен data, все элементы этого массива выровнны на то же самое. Поэтому выделение памяти под N элементов этого массива никак не повлияет на выровненность.
правильно:
QPacket *p;
int sizeof_QPacket = (char*)(p->data) — (char*)p;
malloc(sizeof_QPacket+N*sizeof(p->data[0]))