![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Superklug, понятно, что если разбирать буфер ручками, то конец найти можно. Но это лишает тебя возможности использовать стандартные потоки. Можно написать свой вариант потока, который будет отслеживать конец, конечно. Но поток тогда будет сильно проприетарный - только для одного формата. Неудобно, короче. Дополнительный параметр - размер буфера очень сильно облегчит дело. Так что я бы переписала (добавив, как уже предлагалось, в начало размер) или как-то по-другому передав размер. В strstream
тогда это запихивается элементарно: кажется там есть конструктор с адресом и размером. При записи я бы тоже использовала strstream, ибо доставать c_str из string некузяво: а вдруг там 0 где-нибудь? Понятно, что и размер добыть можно, но лучше уж буфер. -------------------- ... |
|||
|
||||
| Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Наверняка подобное уже писали. Что-то типа memory stream как наследник от стандартного потока stl.
Может в boost::iostreams есть? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну сам подумай: откуда, не зная размера буфера, этот гипотетический поток узнает где конец? У клиента спрашивать будет?
Можешь, конечно, порыться в strstream и посмотреть как он конец отслеживает, может там что-то можно кастомизировать. Но ей-богу, неправильно это. По соотношению "сложность реализации"\"полезность" вариант с добычей размера несомненно зашкаливает в положительном смысле. -------------------- ... |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Superklug
Я не про это, я ищу возможность посчитать полный размер блока без итерации, не пойму в чем проблема хранить полный размер? Зачем искусственно создавать себе проблемы? Добавлено через 53 секунды
и по твоему это легче, чем просто добавить размер в начало буфера? |
|||
|
||||
| Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Доверюсь вашему авторитетному мнению... Копаться в stl гиблое дело) Я даже пробовать боюсь... Спасибо вам за терпение! Добавлено через 1 минуту и 46 секунд
Конечно не легче.. Просто интерфейсы DLL функций и бинарный формат были обговорены. Не хотел менять. Сейчас пойду убеждать в необходимости параметра size) |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Так формат не меняется, просто работать с данными надо начинать со смещения +2 и все, формат тот же, там одна арифметическая операция с указателем добавляется, думаю это просто. В любом случае, архитектура должна подстраиваться под нужды задачи а не наоборот. Это сообщение отредактировал(а) azesmcar - 18.6.2010, 12:56 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
azesmcar, думаю, будет логичней в функции передавать не void*, а const Buffer *. где Buffer это структура типа { size_t size; void *data; }. По сути, это твой же вариант, только более красивый.
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Только не 2, а как минимум 4. Икнуть не успеешь, как 64 К перестанет хватать... Насчет структуры... не знаю... плотный поток данных иногда бывает более предпочтительным. Тем более, что никто не мешает написать: struct CBufffer { size_t m_Size; BYTE mBuf[1]; }; если уж с указателями возиться влом. -------------------- ... |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
| Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
В итоге написал функции для сериализации/десериализации непосредственно для void*.
В случае ошибки всплывает исключение memory access. Вроде все нормально работает... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |