![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Добрый день.
Есть необходимость передать структуру по сети. Описание структур есть на обоих машинах, а вот выравнивание на них может быть разным. Можно ли поменять выравнивание переменной в runtime? т.е. хочется чего-то вроде
Или может есть какое другое решение? изменить выравнивание в проектах или для отдельных структур в рамках проектов не предлагать. хоть вариант самый простой, но недоступный. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
17dufa, объявить 2-3 одинаковых типа с разными выравниваниями и написать преобразования из каждого в каждый.
Добавлено через 1 минуту и 52 секунды Можно даже объявление полей сделать макросом, и вставить его в объявления структур, чтобы все изменения вносились во все 3 типа одновременно. Добавлено через 6 минут и 8 секунд Хотя в таком случае проще наверное написать свою упаковку полей с учетом выравнивания. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Alexeis, структур итак порядка 4 десятков. каждую расплодить на 3 и для каждой из этих 120 написать по процедуре - я повешусь. проще уж 4 десятка рас откопипастить отправку по полям
![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Проще написать функций упаковки для типов. Передаешь текущий адрес, выравнивание, адрес поля и размер типа или же несколько функций типа WriteString/WriteInt/WriteShort/WriteByte, а каждой структуре написать функцию Pack с параметром выравнивание, а в ней уже вызывать функции WriteString/WriteInt/WriteShort/WriteByte. В С++ нет бинарного стандарта, это его большой минус, тут нужно рассчитывать либо на COM либо на фичи компилятора либо стараться сохранить выравнивание одинаковым.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Alexeis, WriteString/WriteInt/WriteShort/WriteByte есть. но писать 40 функций упаковки распаковки копипастом -
![]() если отправка дампом памяти из-за выравниваний не вариант, может есть еще какой способ? как-нить автоматом обойти поля? template тот же применить? или мне дотнетовский Reflection мозги попортил? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Компилятор случайно не билдер? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
использовать pragma pack уже не спортивно? ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
3 разные структуры с разными pragma pack. Lazin, читай внимательно там же в заголовке написано "runtime" -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ну вот я и спрашиваю, зачем все это, почему нельзя использовать одинаковое выравнивание и на стороне клиента и на стороне сервера?
|
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Lazin, как я написал в самом начале "изменить выравнивание в проектах или для отдельных структур в рамках проектов не предлагать. хоть вариант самый простой, но недоступный." отсюда и pragma pack не катит. Хедер с определениями структур - автогенерируемый, каждый раз при пересборке носится по нему и расставлять pragma pack - уж лучше 40 процедур отправки/приема по полям написать и забыть как о страшном сне.
Alexeis, компилятор - MSVC 5. на серваке что-то еще более страшное и древнее (боюсь даже не C++, а С). А чем бы мне помог билдер? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Так есть же опции проекта, там тоже можно менять настройки выравнивания. Или же сделать pragma pack для хидера который объявлен выше, все хидеры которые будут включаться ниже автоматически получат нужное выравнивание из вышестоящего. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
Можно, но такое редко требуется для высокоуровнего языка. Нужно выделить память размером sizeof(Your_structure) + align_size - 1, и выравнять эту память:
Затем нужно скопировать невыровненную структуру в область, на которую указывает mem_pointer. Ещё можно сделать так, как предлагает Alexeis: Эти структуры будут наподобие "буферов". По идее, есть различные библиотеки для передачи/получения данных по сети. И это их обязанность следить за такими вещами (имхо). |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
в этом случае, правильнее всего научить генератор кода вставлять pragma pack в заголовочный файл, еще можно использовать google protocol buffers |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
powerfox, библиотеки - это зло. в нашей конторе все самопальное
![]() (прально или нет - не важно, такова реальность с которой мне бороться пока не по плечу) можно побольше кода насчет смены выравнивания runtime, пока не понимаю. Alexeis, спасибо, но настройки проекта - священная корова, которую мне править не дадут пугая разными бабаями ![]() Lazin, поменять кодогенератор - идея хорошая, поговорю с руководством. как-то даже в голову такая идея не пришла. |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Lazin, идея реализуема, но ружье не стреляет: на клиенте и сервере разное байтовое представление типа double, так что вся изначальная моя идея по отсылке дампа памяти безплодна (есть функции преобразования но для этого надо выцепить double в потоке данных, а для этого опять же нужна отдельная обработка каждой структуры по полям).
есть ли другие способы решить задачу отправки кучи структур одной функцией, а не по полям? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |