Russian Qt Forum

Программирование => С/C++ => Тема начата: Nidxogg от Февраль 17, 2016, 17:43



Название: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 17, 2016, 17:43
Добрый день,
прошу подсказать как можно определить такую структуру (должна быть упакованной) и какой должен быть конструктор
Код:
struct MyPackage
{
    quint16 field1;
    quint16 field2;
    quint32 varLenthArray[N];
    quint16 field3;
}
Надо ли определить свой оператор new для такой структуры?


Название: Re: Структура с массивом переменной длины
Отправлено: Igors от Февраль 17, 2016, 18:40
Если N приличное, то просто заменить varLenthArray на вектор. Можно и добавить поле N, заменить varLenthArray на указатель или индекс и хранить эти данные отдельно.


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 17, 2016, 18:57
Если N приличное, то просто заменить varLenthArray на вектор.
Размер структуры через sizeof все равно не получится же узнать?

Цитировать
Можно и добавить поле N, заменить varLenthArray на указатель или индекс и хранить эти данные отдельно.
Для передачи структуры по сети тогда придется копировать все в QBytearray


Название: Re: Структура с массивом переменной длины
Отправлено: Old от Февраль 17, 2016, 19:04
Для передачи структуры по сети тогда придется копировать все в QBytearray
Именно так и нужно делать, нельзя отправлять сырые структуры по сети. Нужно серилизовать данные с учетом сетевого порядка байт.


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 18, 2016, 00:02
Именно так и нужно делать, нельзя отправлять сырые структуры по сети. Нужно серилизовать данные с учетом сетевого порядка байт.
Т.е. никак не избежать дополнительных  расходов на выделение памяти под QBytearray?

P.S. И как все-таки посоветуете определить такую структуру с точки зрения удобства работы с ней.


Название: Re: Структура с массивом переменной длины
Отправлено: Racheengel от Февраль 18, 2016, 02:40
как вариант завернуть в юнион с байтовым массивом и передавать его по сетке


Название: Re: Структура с массивом переменной длины
Отправлено: Igors от Февраль 18, 2016, 08:07
Размер структуры через sizeof все равно не получится же узнать?
Размер данных - нет, в любом случае никогда не используйте sizeof для записи/чтения/передачи по сети - как бы заманчиво это ни казалось.

Для передачи структуры по сети тогда придется копировать все в QBytearray
Необязательно, лучше всего для передачи использовать тот же оператор <<


Название: Re: Структура с массивом переменной длины
Отправлено: Old от Февраль 18, 2016, 09:10
P.S. И как все-таки посоветуете определить такую структуру с точки зрения удобства работы с ней.
Например так:
Код
C++ (Qt)
class Message
{
public:
   // удобные методы для работы с сообщением
 
   QByteArray          pack() const;    // метод упаковывает объект класса в QByteArray готовый для отправки
   static MessagePtr unpack( const QByteArray &buf );    // Функция распаковывает данные из buf и формирует объект сообщение
private:
   quint16 field1;
   quint16 field2;
   QVector<quint32> varLenthArray;
   quint16 field3;
};
 


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 18, 2016, 14:34
Благодарю, попробую


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 20, 2016, 16:17
Нужно серилизовать данные с учетом сетевого порядка байт.
Каждое поле, размером больше 1 байта придется конвертировать в big-endian?
Можно ли сделать как-то для всей структуры автоматически?


Название: Re: Структура с массивом переменной длины
Отправлено: Old от Февраль 20, 2016, 16:44
Каждое поле, размером больше 1 байта придется конвертировать в big-endian?
Можно ли сделать как-то для всей структуры автоматически?
QByteArray+QDataStream решит все ваши проблемы. :)


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 20, 2016, 17:04
В упор не вижу :(
Разве что это
Код:
QDataStream::QDataStream ( QByteArray * a, QIODevice::OpenMode mode )
+
int QDataStream::writeRawData ( const char * s, int len )


Название: Re: Структура с массивом переменной длины
Отправлено: Old от Февраль 20, 2016, 17:07
Код
C++ (Qt)
QByteArray result;
QDataStream os( &result );
 
ubyte v1 = 10;
int v2 = 20;
QString v3 = "Hi";
 
os << v1 << v2 << v3;
 


Название: Re: Структура с массивом переменной длины
Отправлено: Nidxogg от Февраль 20, 2016, 17:20
В моем понимании это и есть по полям.
Спасибо