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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [QT3] передача структуры  (Прочитано 5823 раз)
V1rus
Гость
« : Октябрь 28, 2009, 17:59 »

Всем доброе время суток. Вопрос следующего плана. Надо передать структуру через сокет. Я передавал строки, цифры, байты, всё было ок, а вот со структурой борода какая то. Структуру копирую в QByteArray(предварительно сделав ему resize) а его уже передаю, на принимающей стороне алгоритм обратный, но в стуктуре нулевые или пустые строки. При том если тестить это на локальной машине(connectToHost("localhost", port)) то данный передаются нормально, если к другой машине коннектишся то всё плохо. Могу предположить что это из за выравнивания структуры компилятором, но как с этим бороться не знаю, такие дерективы как __unaligment не работают почему то. Подскажите кто сталкивался или просто знает как корректно ее передать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 28, 2009, 19:06 »

Относительно выранивания
Код:
#pragma pack(push, 4)      // выровнять на 4 байта

struct MyStruct {
....
};

#pragma pack(pop)          // восстановить предыдущее выравнивание

Но для Qt объектов это поможет "как мертвому припарка"  Улыбающийся  Пишите/читайте в/из потока с помощью операторов << и >>
Записан
Arieserg
Гость
« Ответ #2 : Октябрь 29, 2009, 15:58 »

реализуйте операторы (должны быть inline):
QDataStream & operator>> (QDataStream & s, YourStruct &y)
QDataStream & operator<< (QDataStream & s, const YourStruct &y)

только незабудьте задекларировать свою структуру:
qRegisterMetaType<YourStruct >();
qRegisterMetaStreamOperators<YourStruct >("YourStruct");

затем передавайте свою структуру в поток и считуйте:
QTcpSocket * client;
client->connectToHost(hostName,portNum);
QDataStream out(client);
YourStruct struct;
out<<struct;
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 29, 2009, 17:06 »

реализуйте операторы (должны быть inline):
QDataStream & operator>> (QDataStream & s, YourStruct &y)
QDataStream & operator<< (QDataStream & s, const YourStruct &y)

только незабудьте задекларировать свою структуру:
qRegisterMetaType<YourStruct >();
qRegisterMetaStreamOperators<YourStruct >("YourStruct");

затем передавайте свою структуру в поток и считуйте:
QTcpSocket * client;
client->connectToHost(hostName,portNum);
QDataStream out(client);
YourStruct struct;
out<<struct;

Непонятно, почему обязательно inline? И зачем обязательно регистрировать если планируется явное объявление YourStruct и прямой вызов оператора <<, без использования QVariant и QMetaType? Хотя конечно, если зарегистрировать - хуже не станет Улыбающийся
Записан
Arieserg
Гость
« Ответ #4 : Октябрь 29, 2009, 19:17 »

inline потому что реализация вне класса
регистрировать не обязательно если не будете пихать структуру в QVariant или в Сигналы\Слоты
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 29, 2009, 19:27 »

inline потому что реализация вне класса
Ну и что? Почему я не могу в .h файле написать прототип
Код:
QDataStream & operator>> (QDataStream & s, YourStruct &y);

А затем написать тело в одном из .cpp
Код:
QDataStream & operator>> (QDataStream & s, YourStruct &y)
{
...
}
?
Записан
Arieserg
Гость
« Ответ #6 : Октябрь 29, 2009, 23:53 »

можете, но скорее всего свою структуру объявляете в заголовочном файле и там же захотите реализовать операторы << >>
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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