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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memory stream в C++, Работа с памятью как с потоками.. 
V
    Опции темы
Earnest
Дата 18.6.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Superklug, понятно, что если разбирать буфер ручками, то конец найти можно. Но это лишает тебя возможности использовать стандартные потоки. Можно написать свой вариант потока, который будет отслеживать конец, конечно. Но поток тогда будет сильно проприетарный - только для одного формата. Неудобно, короче. Дополнительный параметр - размер буфера  очень сильно облегчит дело. Так что я бы переписала (добавив, как уже предлагалось, в начало размер) или как-то по-другому передав размер. В strstream
тогда это запихивается элементарно: кажется там есть конструктор с адресом и размером.
При записи я бы тоже использовала strstream, ибо доставать c_str из string некузяво: а вдруг там 0 где-нибудь? Понятно, что и размер добыть можно, но лучше уж буфер.


--------------------
...
PM   Вверх
Superklug
Дата 18.6.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Наверняка подобное уже писали. Что-то типа memory stream как наследник от стандартного потока stl.
Может в boost::iostreams есть?
PM MAIL   Вверх
Earnest
Дата 18.6.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ну сам подумай: откуда, не зная размера буфера, этот гипотетический поток узнает где конец? У клиента спрашивать будет?
Можешь, конечно, порыться в strstream и посмотреть как он конец отслеживает, может там что-то можно кастомизировать. Но ей-богу, неправильно это. По соотношению "сложность реализации"\"полезность" вариант с добычей размера несомненно зашкаливает в положительном смысле. 


--------------------
...
PM   Вверх
azesmcar
Дата 18.6.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Superklug

Я не про это, я ищу возможность посчитать полный размер блока без итерации, не пойму в чем проблема хранить полный размер? Зачем искусственно создавать себе проблемы?

Добавлено через 53 секунды
Цитата(Superklug @  18.6.2010,  12:42 Найти цитируемый пост)
Наверняка подобное уже писали. Что-то типа memory stream как наследник от стандартного потока stl.

и по твоему это легче, чем просто добавить размер в начало буфера?
PM   Вверх
Superklug
Дата 18.6.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Earnest @  18.6.2010,  12:47 Найти цитируемый пост)
Ну сам подумай: откуда, не зная размера буфера, этот гипотетический поток узнает где конец? У клиента спрашивать будет?
Можешь, конечно, порыться в strstream и посмотреть как он конец отслеживает, может там что-то можно кастомизировать. Но ей-богу, неправильно это. По соотношению "сложность реализации"\"полезность" вариант с добычей размера несомненно зашкаливает в положительном смысле.  

Доверюсь вашему авторитетному мнению...
Копаться в stl гиблое дело) Я даже пробовать боюсь...

Спасибо вам за терпение!  smile

Добавлено через 1 минуту и 46 секунд
Цитата(azesmcar @  18.6.2010,  12:49 Найти цитируемый пост)
и по твоему это легче, чем просто добавить размер в начало буфера? 

Конечно не легче.. Просто интерфейсы DLL функций и бинарный формат были обговорены. Не хотел менять. Сейчас пойду убеждать в необходимости параметра size)
PM MAIL   Вверх
azesmcar
Дата 18.6.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Superklug @  18.6.2010,  12:51 Найти цитируемый пост)
Конечно не легче.. Просто интерфейсы DLL функций и бинарный формат были обговорены. Не хотел менять. Сейчас пойду убеждать в необходимости параметра size) 

Так формат не меняется, просто работать с данными надо начинать со смещения +2 и все, формат тот же, там одна арифметическая операция с указателем добавляется, думаю это просто. В любом случае, архитектура должна подстраиваться под нужды задачи а не наоборот.

Это сообщение отредактировал(а) azesmcar - 18.6.2010, 12:56
PM   Вверх
bsa
Дата 18.6.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



azesmcar, думаю, будет логичней в функции передавать не void*, а const Buffer *. где Buffer это структура типа { size_t size; void *data; }. По сути, это твой же вариант, только более красивый. smile
PM   Вверх
azesmcar
Дата 18.6.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(bsa @  18.6.2010,  15:11 Найти цитируемый пост)
azesmcar, думаю, будет логичней в функции передавать не void*, а const Buffer *. где Buffer это структура типа { size_t size; void *data; }. По сути, это твой же вариант, только более красивый. smile 

ну автор не хотел менять интерфейс DLL, а вообще да, согласен smile 
PM   Вверх
Earnest
Дата 18.6.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(azesmcar @  18.6.2010,  13:56 Найти цитируемый пост)
просто работать с данными надо начинать со смещения +2

Только не 2, а как минимум 4. Икнуть не успеешь, как 64 К перестанет хватать...

 Насчет структуры... не знаю... плотный поток данных иногда бывает более предпочтительным. Тем более, что никто не мешает написать:
struct CBufffer
{
   size_t m_Size;
   BYTE  mBuf[1];
};
если уж с указателями возиться влом.


--------------------
...
PM   Вверх
azesmcar
Дата 18.6.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Earnest @  18.6.2010,  15:47 Найти цитируемый пост)
Только не 2, а как минимум 4. Икнуть не успеешь, как 64 К перестанет хватать...

Ну да, я писал об этом в самом начале, это уже в зависимости от задачи smile 
PM   Вверх
Superklug
Дата 22.6.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В итоге написал функции для сериализации/десериализации непосредственно для void*.
В случае ошибки всплывает исключение memory access.

Вроде все нормально работает... 
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.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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