Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка кучи структур 
:(
    Опции темы
17dufa
Дата 2.9.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Добрый день.
Есть необходимость передать структуру по сети. Описание структур есть на обоих машинах, а вот выравнивание на них может быть разным. 
Можно ли поменять выравнивание переменной в runtime? т.е. хочется чего-то вроде
Код

//клиент
struct MyStruct{ long lField; char cField};
.....
MyStruct c;
ChangeAlignTo(c, 1);
Send(&c, sizeof(long) + sizeof(char));
....

//сервер
struct MyStruct{ long lField; char cField};
....
MyStruct c;
Receive(&c, sizeof(long) + sizeof(char));
ChangeAlignFrom(c, 1);
....

Или может есть какое другое решение? 

изменить выравнивание в проектах или для отдельных структур в рамках проектов не предлагать. хоть вариант самый простой, но недоступный.
PM MAIL   Вверх
Alexeis
Дата 2.9.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



17dufa, объявить 2-3 одинаковых типа с разными выравниваниями и написать преобразования из каждого в каждый.

Добавлено через 1 минуту и 52 секунды
  Можно даже объявление полей сделать макросом, и вставить его в объявления структур, чтобы все изменения вносились во все 3 типа одновременно.

Добавлено через 6 минут и 8 секунд
  Хотя в таком случае проще наверное написать свою упаковку полей с учетом выравнивания. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
17dufa
Дата 2.9.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Alexeis, структур итак порядка 4 десятков. каждую расплодить на 3 и для каждой из этих 120 написать по процедуре - я повешусь. проще уж 4 десятка рас откопипастить отправку по полям smile 
PM MAIL   Вверх
Alexeis
Дата 2.9.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Проще написать функций упаковки для типов. Передаешь текущий адрес, выравнивание, адрес поля и размер типа или же несколько функций типа WriteString/WriteInt/WriteShort/WriteByte, а каждой структуре написать функцию Pack с параметром выравнивание, а в ней уже вызывать функции WriteString/WriteInt/WriteShort/WriteByte. В С++ нет бинарного стандарта, это его большой минус, тут нужно рассчитывать либо на COM либо на фичи компилятора либо стараться сохранить выравнивание одинаковым. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
17dufa
Дата 2.9.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Alexeis, WriteString/WriteInt/WriteShort/WriteByte есть. но писать 40 функций упаковки распаковки копипастом -  smile  убейте меня веником. 
если отправка дампом памяти из-за выравниваний не вариант, может есть еще какой способ? 
как-нить автоматом обойти поля? template тот же применить? или мне дотнетовский Reflection мозги попортил?
PM MAIL   Вверх
Alexeis
Дата 2.9.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(17dufa @  2.9.2009,  13:01 Найти цитируемый пост)
как-нить автоматом обойти поля? template тот же применить? или мне дотнетовский Reflection мозги попортил? 

  Компилятор случайно не билдер?  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 2.9.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(17dufa @  2.9.2009,  12:36 Найти цитируемый пост)
Есть необходимость передать структуру по сети. Описание структур есть на обоих машинах, а вот выравнивание на них может быть разным. 
Можно ли поменять выравнивание переменной в runtime? т.е. хочется чего-то вроде


Цитата(Alexeis @  2.9.2009,  12:56 Найти цитируемый пост)
объявить 2-3 одинаковых типа с разными выравниваниями и написать преобразования из каждого в каждый


использовать pragma pack уже не спортивно? smile
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 2.9.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Lazin @  2.9.2009,  13:20 Найти цитируемый пост)
использовать pragma pack уже не спортивно?

  3 разные структуры с разными pragma pack
Lazin, читай внимательно там же в заголовке написано "runtime"


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 2.9.2009, 14:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ну вот я и спрашиваю, зачем все это, почему нельзя использовать одинаковое выравнивание и на стороне клиента и на стороне сервера?
PM MAIL Skype GTalk   Вверх
17dufa
Дата 2.9.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Lazin, как я написал в самом начале "изменить выравнивание в проектах или для отдельных структур в рамках проектов не предлагать. хоть вариант самый простой, но недоступный." отсюда и pragma pack не катит. Хедер с определениями структур - автогенерируемый, каждый раз при пересборке носится по нему и расставлять pragma pack - уж лучше 40 процедур отправки/приема по полям написать и забыть как о страшном сне.

Alexeis, компилятор - MSVC 5. на серваке что-то еще более страшное и древнее (боюсь даже не C++, а С). А чем бы мне помог билдер?
PM MAIL   Вверх
Alexeis
Дата 2.9.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(17dufa @  2.9.2009,  13:35 Найти цитируемый пост)
Хедер с определениями структур - автогенерируемый, каждый раз при пересборке носится по нему и расставлять pragma pack - уж лучше 40 процедур отправки/приема по полям написать и забыть как о страшном сне.

  Так есть же опции проекта, там тоже можно менять настройки выравнивания. Или же сделать pragma pack для хидера который объявлен выше, все хидеры которые будут включаться ниже автоматически получат нужное выравнивание из вышестоящего.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
powerfox
Дата 2.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(17dufa @  2.9.2009,  13:36 Найти цитируемый пост)
Можно ли поменять выравнивание переменной в runtime?

Можно, но такое редко требуется для высокоуровнего языка. Нужно выделить память размером sizeof(Your_structure) + align_size - 1, и выравнять эту память:
Код

mem_pointer = align + ((mem_pointer - 1) & ~(align - 1));


Затем нужно скопировать невыровненную структуру в область, на которую указывает mem_pointer.

Ещё можно сделать так, как предлагает Alexeis:
Цитата(Alexeis @  2.9.2009,  15:28 Найти цитируемый пост)
  3 разные структуры с разными pragma pack. 

Эти структуры будут наподобие "буферов".

Цитата(17dufa @  2.9.2009,  13:36 Найти цитируемый пост)
Есть необходимость передать структуру по сети.

По идее, есть различные библиотеки для передачи/получения данных по сети. И это их обязанность следить за такими вещами (имхо).





--------------------
user posted image
PM WWW   Вверх
Lazin
Дата 2.9.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(17dufa @  2.9.2009,  14:35 Найти цитируемый пост)
Хедер с определениями структур - автогенерируемый, каждый раз при пересборке носится по нему и расставлять pragma pack - уж лучше 40 процедур отправки/приема по полям написать и забыть как о страшном сне.

в этом случае, правильнее всего научить генератор кода вставлять pragma pack в заголовочный файл, еще можно использовать google protocol buffers
PM MAIL Skype GTalk   Вверх
17dufa
Дата 2.9.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



powerfox, библиотеки - это зло. в нашей конторе все самопальное smile 
(прально или нет - не важно, такова реальность с которой мне бороться пока не по плечу)
можно побольше кода насчет смены выравнивания runtime, пока не понимаю.

Alexeis, спасибо, но настройки проекта - священная корова, которую мне править не дадут пугая разными бабаями smile (уже пробовал)

Lazin, поменять кодогенератор - идея хорошая, поговорю с руководством. как-то даже в голову такая идея не пришла.
PM MAIL   Вверх
17dufa
Дата 7.9.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



Lazin, идея реализуема, но ружье не стреляет: на клиенте и сервере разное байтовое представление типа double, так что вся изначальная моя идея по отсылке дампа памяти безплодна (есть функции преобразования но для этого надо выцепить double в потоке данных, а для этого опять же нужна отдельная обработка каждой структуры по полям).
 есть ли другие способы решить задачу отправки кучи структур одной функцией, а не по полям?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1173 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.