Russian Qt Forum
Ноябрь 22, 2024, 12:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Структура с массивом переменной длины  (Прочитано 9977 раз)
Nidxogg
Гость
« : Февраль 17, 2016, 17:43 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 17, 2016, 18:40 »

Если N приличное, то просто заменить varLenthArray на вектор. Можно и добавить поле N, заменить varLenthArray на указатель или индекс и хранить эти данные отдельно.
Записан
Nidxogg
Гость
« Ответ #2 : Февраль 17, 2016, 18:57 »

Если N приличное, то просто заменить varLenthArray на вектор.
Размер структуры через sizeof все равно не получится же узнать?

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

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Февраль 17, 2016, 19:04 »

Для передачи структуры по сети тогда придется копировать все в QBytearray
Именно так и нужно делать, нельзя отправлять сырые структуры по сети. Нужно серилизовать данные с учетом сетевого порядка байт.
Записан
Nidxogg
Гость
« Ответ #4 : Февраль 18, 2016, 00:02 »

Именно так и нужно делать, нельзя отправлять сырые структуры по сети. Нужно серилизовать данные с учетом сетевого порядка байт.
Т.е. никак не избежать дополнительных  расходов на выделение памяти под QBytearray?

P.S. И как все-таки посоветуете определить такую структуру с точки зрения удобства работы с ней.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Февраль 18, 2016, 02:40 »

как вариант завернуть в юнион с байтовым массивом и передавать его по сетке
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 18, 2016, 08:07 »

Размер структуры через sizeof все равно не получится же узнать?
Размер данных - нет, в любом случае никогда не используйте sizeof для записи/чтения/передачи по сети - как бы заманчиво это ни казалось.

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

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Февраль 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;
};
 
Записан
Nidxogg
Гость
« Ответ #8 : Февраль 18, 2016, 14:34 »

Благодарю, попробую
Записан
Nidxogg
Гость
« Ответ #9 : Февраль 20, 2016, 16:17 »

Нужно серилизовать данные с учетом сетевого порядка байт.
Каждое поле, размером больше 1 байта придется конвертировать в big-endian?
Можно ли сделать как-то для всей структуры автоматически?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Февраль 20, 2016, 16:44 »

Каждое поле, размером больше 1 байта придется конвертировать в big-endian?
Можно ли сделать как-то для всей структуры автоматически?
QByteArray+QDataStream решит все ваши проблемы. Улыбающийся
Записан
Nidxogg
Гость
« Ответ #11 : Февраль 20, 2016, 17:04 »

В упор не вижу Грустный
Разве что это
Код:
QDataStream::QDataStream ( QByteArray * a, QIODevice::OpenMode mode )
+
int QDataStream::writeRawData ( const char * s, int len )
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Февраль 20, 2016, 17:07 »

Код
C++ (Qt)
QByteArray result;
QDataStream os( &result );
 
ubyte v1 = 10;
int v2 = 20;
QString v3 = "Hi";
 
os << v1 << v2 << v3;
 
Записан
Nidxogg
Гость
« Ответ #13 : Февраль 20, 2016, 17:20 »

В моем понимании это и есть по полям.
Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.142 секунд. Запросов: 22.