powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм для сохранения последних состояний в программе.
20 сообщений из 20, страница 1 из 1
Алгоритм для сохранения последних состояний в программе.
    #39952194
Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов.
Как это сделать чисто алгоритмически (как сделать в коде я разберусь).
Допустим (для примера) состояние программы храниться в виде записи.
Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования.
Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу).
Можно сделать связанные списки и тоже гонять по кругу.
Можно просто через указатели.
Может быть ещё как-то через стек можно.

Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску.
Посему два вопроса:
1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952244
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически.

Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952256
softwarer
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически.

Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее.

Можно было и проще написать: вместо состояния программы лучше вести лог и для каждой операции иметь обратную.

Это всё понятно и очевидно, сразу об этом думал, но требует принципиально другого подхода к алгоритму программы, при том такую возможность надо закладывать сразу. Я вот не заложил, да и сложно это под мои цели, проще состояние всей программы сохранить и к ней откатить так же для меня это удобно в части пересылки сообщений между программами - полный набор данных в сообщении как раз состояние.

Ну и опять же, неужели все хранят бесконечные логи? Как реализовывают функционал "сохранить последние 1000 операций"? Для примера, при добавлении 1001 надо выкинуть 1ю. Как это реализовывают?
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952257
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Как это реализовывают?

Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий.

Содержимое элемента любое. Хоть record, хоть объект.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952258
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
но требует принципиально другого подхода к алгоритму программы

Да нет. Это просто требует вместо onclick-ов, напрямую лезущих в состояние программы, использовать объекты класса "команда". Вполне внедряется в готовое приложение, хотя, конечно, усилий требует.

Андрей Игоревич
проще состояние всей программы сохранить

Тогда ненужные копирования, о которых ты печёшься - незначимая мелочь на этом фоне. Делай как угодно.

Андрей Игоревич
Как реализовывают функционал "сохранить последние 1000 операций"?

А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952260
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?

Я думаю, что 1000 он взял с потолка имея ввиду, что есть какой-то ограниченный чем-то (определенным количеством или свободной памятью) лог для отката.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952262
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Я думаю, что 1000 он взял с потолка

Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952263
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов.
Как это сделать чисто алгоритмически (как сделать в коде я разберусь).
Допустим (для примера) состояние программы храниться в виде записи.
Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования.
Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу).
Можно сделать связанные списки и тоже гонять по кругу.
Можно просто через указатели.
Может быть ещё как-то через стек можно.

Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску.
Посему два вопроса:
1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
Это очень непростая задача, называется "персистентные структуры данных".
Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности.
И нерешённость этой задачи очень мешает распространению функциональных языков.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952269
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место.
Есть еще нюанс что не всегда обратное действие возможно в принципе. Фарш как известно невозможно провернуть назад и мясо из котлет не восстановишь.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952270
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
Есть еще нюанс что не всегда обратное действие возможно в принципе.

Это эквивалентно утверждению, что предыдущего состояния программы не существовало в принципе.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952300
wadman
Андрей Игоревич
Как это реализовывают?

Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий.

Содержимое элемента любое. Хоть record, хоть объект.

Ну значит так и сделаю, зря чтоль недавно их изучал :).

softwarer
wadman
Я думаю, что 1000 он взял с потолка

Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают.

Я подумаю над этим, но на первый взгляд как-то очень много всего надо. Дело ведь не только в кликах, данные могут быть загружены из файла, могут быть переданы в виде сообщения (как целиком, так и частично), есть операции которые делают кучу расчётов (там прям прилично математики, хоть и простой), для каждого случая надо придумывать возможность вернуться назад...

kealon(Ruslan)
Это очень непростая задача, называется "персистентные структуры данных".
Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности.
И нерешённость этой задачи очень мешает распространению функциональных языков.

Спасибо, изучу.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952306
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример: FastReport, редактор шаблонов отчетов.
Тупо сохраняют в памяти весь шаблон при почти любых изменениях.
Работает быстро. Нормальный подход, почти не требуется морщить моск.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952317
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич

1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
1. кольцевой буфер https://en.wikipedia.org/wiki/Circular_buffer
2. https://stackoverflow.com/questions/1600318/where-can-i-find-a-good-delphi-or-object-pascal-implementation-for-a-circular-bu
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952334
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

Андрей Игоревич
Как реализовывают функционал "сохранить последние 1000 операций"?

А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?

XE7: меню "Tools/Options" - раздел "Editor Options", параметр "Undo Limit"
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952338
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

да, точно, появилась такая фигня.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952340
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Polesov,

да, точно, появилась такая фигня.

Э-э-э... Могу ошибаться, но подобная "фигня" была еще в Borland Pascal 7.0
По крайней мере в D5 точно есть )
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952344
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

ничего не могу сказать. Вероятность того, что я всё это время не обращал на неё внимание, отлична от нуля.
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952347
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Polesov,

ничего не могу сказать.

Я сделал это не в интересах истины, а в интересах правды. (c) )
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952348
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным
будет передвинуть в старое место. И так далее.

В некоторых случаях это будет труднее сохранения снапшота состояния.

Схему хранения последовательности изменений использовал CVS. GIT, считающийся более
прогрессивным, использует хранение снапшотов состояния.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Алгоритм для сохранения последних состояний в программе.
    #39952360
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
В некоторых случаях это будет труднее сохранения снапшота состояния

Да. Но это в любых случаях будет куда более экономным, нежели сохранение снапшота состояния.

Dimitry Sibiryakov
CVS. GIT,

К разным ситуациям разные требования. Задаче undo/redo не требуется думать о быстром сравнении версий 666 и 1666, сохранности данных в случаях частичного краша винта и т. д.

Напомню моё утверждение: по сравнению с тратами на "сохранение снапшотов" выбор между массивом, кольцевым буфером или любой другой структурой хранения указателей на эти снапшоты непринципиален. Есть возражения?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм для сохранения последних состояний в программе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]