|
|
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов. Как это сделать чисто алгоритмически (как сделать в коде я разберусь). Допустим (для примера) состояние программы храниться в виде записи. Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования. Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу). Можно сделать связанные списки и тоже гонять по кругу. Можно просто через указатели. Может быть ещё как-то через стек можно. Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску. Посему два вопроса: 1. Как называют такой алгоритм 2. Как обычно его реализовывают на Delphi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 06:59 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически. Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:18 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarer Андрей Игоревич Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически. Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее. Можно было и проще написать: вместо состояния программы лучше вести лог и для каждой операции иметь обратную. Это всё понятно и очевидно, сразу об этом думал, но требует принципиально другого подхода к алгоритму программы, при том такую возможность надо закладывать сразу. Я вот не заложил, да и сложно это под мои цели, проще состояние всей программы сохранить и к ней откатить так же для меня это удобно в части пересылки сообщений между программами - полный набор данных в сообщении как раз состояние. Ну и опять же, неужели все хранят бесконечные логи? Как реализовывают функционал "сохранить последние 1000 операций"? Для примера, при добавлении 1001 надо выкинуть 1ю. Как это реализовывают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:44 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Как это реализовывают? Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий. Содержимое элемента любое. Хоть record, хоть объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:48 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич но требует принципиально другого подхода к алгоритму программы Да нет. Это просто требует вместо onclick-ов, напрямую лезущих в состояние программы, использовать объекты класса "команда". Вполне внедряется в готовое приложение, хотя, конечно, усилий требует. Андрей Игоревич проще состояние всей программы сохранить Тогда ненужные копирования, о которых ты печёшься - незначимая мелочь на этом фоне. Делай как угодно. Андрей Игоревич Как реализовывают функционал "сохранить последние 1000 операций"? А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:50 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarer Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"? Я думаю, что 1000 он взял с потолка имея ввиду, что есть какой-то ограниченный чем-то (определенным количеством или свободной памятью) лог для отката. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:53 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
wadman Я думаю, что 1000 он взял с потолка Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:57 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов. Как это сделать чисто алгоритмически (как сделать в коде я разберусь). Допустим (для примера) состояние программы храниться в виде записи. Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования. Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу). Можно сделать связанные списки и тоже гонять по кругу. Можно просто через указатели. Может быть ещё как-то через стек можно. Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску. Посему два вопроса: 1. Как называют такой алгоритм 2. Как обычно его реализовывают на Delphi. Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности. И нерешённость этой задачи очень мешает распространению функциональных языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:57 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
авторДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. Есть еще нюанс что не всегда обратное действие возможно в принципе. Фарш как известно невозможно провернуть назад и мясо из котлет не восстановишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 11:13 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
makhaon Есть еще нюанс что не всегда обратное действие возможно в принципе. Это эквивалентно утверждению, что предыдущего состояния программы не существовало в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 11:16 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
wadman Андрей Игоревич Как это реализовывают? Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий. Содержимое элемента любое. Хоть record, хоть объект. Ну значит так и сделаю, зря чтоль недавно их изучал :). softwarer wadman Я думаю, что 1000 он взял с потолка Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают. Я подумаю над этим, но на первый взгляд как-то очень много всего надо. Дело ведь не только в кликах, данные могут быть загружены из файла, могут быть переданы в виде сообщения (как целиком, так и частично), есть операции которые делают кучу расчётов (там прям прилично математики, хоть и простой), для каждого случая надо придумывать возможность вернуться назад... kealon(Ruslan) Это очень непростая задача, называется "персистентные структуры данных". Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности. И нерешённость этой задачи очень мешает распространению функциональных языков. Спасибо, изучу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 12:17 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Пример: FastReport, редактор шаблонов отчетов. Тупо сохраняют в памяти весь шаблон при почти любых изменениях. Работает быстро. Нормальный подход, почти не требуется морщить моск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 12:21 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич 1. Как называют такой алгоритм 2. Как обычно его реализовывают на Delphi. 2. https://stackoverflow.com/questions/1600318/where-can-i-find-a-good-delphi-or-object-pascal-implementation-for-a-circular-bu ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 12:41 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarer Андрей Игоревич Как реализовывают функционал "сохранить последние 1000 операций"? А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"? XE7: меню "Tools/Options" - раздел "Editor Options", параметр "Undo Limit" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:25 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Polesov, да, точно, появилась такая фигня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:29 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarer Polesov, да, точно, появилась такая фигня. Э-э-э... Могу ошибаться, но подобная "фигня" была еще в Borland Pascal 7.0 По крайней мере в D5 точно есть ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:33 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Polesov, ничего не могу сказать. Вероятность того, что я всё это время не обращал на неё внимание, отлична от нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:39 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarer Polesov, ничего не могу сказать. Я сделал это не в интересах истины, а в интересах правды. (c) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:43 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
softwarerДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее. В некоторых случаях это будет труднее сохранения снапшота состояния. Схему хранения последовательности изменений использовал CVS. GIT, считающийся более прогрессивным, использует хранение снапшотов состояния. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 13:43 |
|
||
|
Алгоритм для сохранения последних состояний в программе.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov В некоторых случаях это будет труднее сохранения снапшота состояния Да. Но это в любых случаях будет куда более экономным, нежели сохранение снапшота состояния. Dimitry Sibiryakov CVS. GIT, К разным ситуациям разные требования. Задаче undo/redo не требуется думать о быстром сравнении версий 666 и 1666, сохранности данных в случаях частичного краша винта и т. д. Напомню моё утверждение: по сравнению с тратами на "сохранение снапшотов" выбор между массивом, кольцевым буфером или любой другой структурой хранения указателей на эти снапшоты непринципиален. Есть возражения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 14:09 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=46&tid=2038373]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 353ms |

| 0 / 0 |
