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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс редактирования данных. Нужны советы по реализации 
:(
    Опции темы
formut
Дата 15.9.2014, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:
Код
void Change(unsigned long StartByte, const void *NewData, unsigned long DataSize);
void Delete(unsigned long StartByte, unsigned long Size);
void Insert(unsigned long StartByte, const void *Data, unsigned long DataSize);
Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его.

Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов:
Код
Insert(5, MyData, 10); // Вставляем между 4-ым и 5-ым байтами 10 байтов MyData.
Delete(7, 2);          // Удаляем 7-ой и 8-ой байты.
Delete(4, 10);         // Удаляем с 4-го по 13-ый байты.
На деле, такая запись аналогична записи:
Код
Delete(4, 2);
Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта:
Код
unsigned long GetData(void *Buffer, unsigned long BufferSize);
Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями.

Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI.
PM MAIL   Вверх
sQu1rr
Дата 15.9.2014, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что подрузамевает delete? удаление байт со смещением, и уменьшение размеров исходных данных? как vector.remove или как его там? или просто затирание 0ми?
Если второе, то изменение ланных на лету - оптимально

Это я к тому что если передается указатель на данные, то не вы же контролируете их размер

Правда как тогда будет insert работать - ума не приложу

Это сообщение отредактировал(а) sQu1rr - 15.9.2014, 22:23
PM MAIL Skype GTalk   Вверх
math64
Дата 16.9.2014, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Чтобы много не выдумывать, Вам следует применить базу данных, умеющую работать в памяти, например sqlite. Перед началом измененией начинаете тразакцию transaction(), в конце делаете commit() или rollback() чтобы отказаться от изменений. Или реализуйте механизм транзакций самостоятельно.
PM   Вверх
xvr
Дата 16.9.2014, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(formut @  15.9.2014,  21:41 Найти цитируемый пост)
Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта:

Вычисление того, что в результате нужно будет сделать над исходными данными при применении к ним последовательности операций тоже требует времени и ресурсов, причем скорее всего больше, чем само копирование данных. Так что 'удалять промежуточные шаги' имеет смысл только в том случае, если у вас очень большие массивы данных либо вы планируете применять одни и те же модификации многократно.

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

Для вашего примера (положим начальный массив был 20 байтов):
Код

// Original interval: 0-19 @org
Insert(4, MyData, 10); // Вставляем между 4-ым и 5-ым байтами 10 байтов MyData.
// 0-3 @org, 4-13 @MyData, 14-28 @org+4
Delete(7, 2);          // Удаляем 7-ой и 8-ой байты.
// 0-3 @org, 4-6 @MyData, 7-11 @MyData+5, 12-26 @org+4
Delete(4, 10);         // Удаляем с 4-го по 13-ый байты.
// 0-3 @org, 4-18 @org+6


PM MAIL   Вверх
math64
Дата 17.9.2014, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Только учтите, если будете действовать как советует xvr, промежуточные данные (MyData) должны сохраняться до получения результата.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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