Имя: Пароль:
IT
 
Написание клеточного автомата.
0 Torquader
 
19.09.16
12:41
Столкнулся с необходимостью реализации алгоритма в виде клеточного автомата (это такая система, которая находится в одном из нескольких состояний).
Обычно, клеточный автомат описывается через серию меток (одна на каждое состояние) и операторов Goto.
Второй общеупотребимый вариант - использование таблицы функций из которой выбирается функция, соответствующая состоянию, так как в 1С указателей на функции нет, а использование "Выполнить" вызывает компиляцию заключённого в него выражения, то этот метод отпадает.
Конечно, часто используется Switch, то опять же, в 1С его нет и он не сильно отличается по смыслу от goto.
Просто, хотелось бы понять, есть ли способ описания, который по пониманию не сильно отличается от goto (последние в коде 1С смотрятся не очень).
Заранее благодарен за ответы.
1 Fragster
 
гуру
19.09.16
12:42
Если ... ИначеЕсли и есть switch и при этом СИЛЬНО отличается от goto...
2 Fragster
 
гуру
19.09.16
12:43
вернее по классике switch как раз и был с goto в конец, если-инаечеесли этого лишен, и правильно.
3 Torquader
 
19.09.16
12:44
(1) По производительности тоже отличается, так как если состояний больше десяти, то при каждом переходе будет выполняться сравнение всех от начала.
4 Fragster
 
гуру
19.09.16
12:47
(3) у тебя сравнение состояния выполняется по времени сопоставимо с "действием"? тогда проведи частотный анализ и наиболее массовые "позитивные" условия вынеси вверх. В switch сравнение также происходит последовательно.
5 Torquader
 
19.09.16
12:47
(2) Как бы, аналог switch:

Пока Истина Цикл
Если СостояниеАвтомата=Состояние1 Тогда
  // что-то выполняем
  Продолжить;
КонецЕсли;
Если СостояниеАвтомата=Состояние2 Тогда
  // что-то выполняем
  Продолжить;
КонецЕсли;
Сообщить("Неизвестное состояние:"+СостяниеАвтомата);
Прервать;
КонецЦикла;
6 Torquader
 
19.09.16
12:49
(4) Естественно - автомат проверяет некоторые данные, которые изменяются из-вне и переходит в состояния - данных - там несколько ячеек памяти через COM-объект.
На некоторые состояния система начинает выполнять действие, но периодически должна проверять, что "ничего не случилось".
7 Fragster
 
гуру
19.09.16
12:50
(5) не совсем верно.
полный аналог очень кривой, так как без продолжить и без проверки "последующих условий", т.е.

Если Условие 1 гоуту метка 1
Если Условие 2 гоуту метка 2
...
метка 1
действие 1
метка 2
действие 2
...

и если действие 1 не включает в себя переход в конец, то действие2 при условии 1 также будет выполнено

(6) тогда в чем проблема-то? чего не хватает? разницы же нет.
8 Torquader
 
19.09.16
12:51
Видимо, часть "быстрых" проверок придётся вынести в COM-объект, где на Си прекрасно пишется с goto, а то, что останется в 1С, можно и через Если ИначеЕсли сделать.
9 Torquader
 
19.09.16
12:54
с goto получается так:

goto НачальноеСостояние;

Метка Состояние1:
// какой-то код
Если Условие1()=ИСТИНА Тогда
   goto Состояние2;
КонецЕсли;
// ещё какой-то код
Если Условие2()=ИСТИНА Тогда
  goto Состояние3;
КонецЕсли;

Метка Состояние2:
// какой-то код

Метка Состояние3:
// какой-то код

Просто, над каждой меткой можно написать комментарий о состоянии, и попадать в это состояние можно из любого места кода.
10 Garykom
 
гуру
19.09.16
12:55
Клеточный автомат прекрасно через объекты, списки, таблицы и переменные описывается в виде графа направленного.
11 Torquader
 
19.09.16
12:55
Просто, хотелось бы, чтобы если кто-то в этом коде начал копаться, он хоть как-то мог понять, что этот код делает.
12 Fragster
 
гуру
19.09.16
12:55
(9) так в 1с все также реализовывается на ИначеЕсли
13 Torquader
 
19.09.16
12:56
(10) Ну, и где это в 1С ?
14 DailyLookingOnA Sunse
 
19.09.16
12:56
(13)
Структуры и соответствия.
15 Garykom
 
гуру
19.09.16
12:57
(10)+ https://habrahabr.ru/post/65367/

(11) Нафуя? К примеру regexp все по сути конечные (а не "клеточные") автоматы но ни одно ни другое мало кто осилил ))
16 DailyLookingOnA Sunse
 
19.09.16
12:57
Ну и до кучи: конечный автомат.
Клеточный автомат - это про другое.
17 Garykom
 
гуру
19.09.16
12:57
(13) ТЗ и переменные есть в 1С ))
18 Torquader
 
19.09.16
12:58
Просто вариант вида:

Пока лбРаботает=ИСТИНА Цикл
Если(СостояниеАвтомата>=МинимальноеСостояние)И(СостояниеАвтомата<=МаксимальноеСостояние)Тогда
  Выполнить("ОбработкаСостояния"+Формат(СостояниеАвтомата,"ЧГ=0;ЧН=0;"));
КонецЕсли;
КонецЦикла;

// как-то не очень понятным кажется.
19 Torquader
 
19.09.16
13:01
(17) Ну, понятно, что можно взять таблицу или список, где записан код состояния и вызываемая функция и просто менять текущую строку этого списка, но это примерно тоже самое, что и (18).
Опять же, можно даже исхитриться и запихать в таблицу условия, чтобы сам код был интерпретатором того, что написано в таблице - но - добавит ли это понимания.
С таблицей, просто, не меняя код, можно новое состояние добавить - но, вопрос, в скорости работы.

Это же, всё-таки, не JavaScript - где и вопросов не возникает, как реализовывать.
20 Fragster
 
гуру
19.09.16
13:01
Если Состояние = Состояние 1 Тогда
  ДействияСостояния1();
ИначеЕсли Состояние = Состояние 2 Тогда
  ДействияСостояния2();
ИначеЕсли Состояние = Состояние 3 Тогда
  ДействияСостояния1(); // ну хз, зачем, но автор, видимо, хочет
  ДействияСостояния3();
...
21 Torquader
 
19.09.16
13:03
(20) У меня такая "фигня" была, когда я в DOS-приложении Wizzard писал - он как раз конечным автоматом и являлся и, по сравнению с нажатием кнопок пользователем, всё остальное было не существенно.
22 Garykom
 
гуру
19.09.16
13:04
(19) В 1С есть ООП в виде объектов (справочники, документы, обработки) кто мешает заюзать?

И будет КА в виде справочников к примеру с ТЧ где другие следующие справочники ))
23 Torquader
 
19.09.16
13:07
(22) Ты предлагаешь сразу писать КА, который будет пользователем настраиваться.
Понятно, что справочник - это состояния, а в табличных частях можно написать условия перехода и ссылки на новые состояния.
Всё будет красиво и просто и даже таблицу потом по состояниям можно распечатать, чтобы пользователю удобно было.

Но, мы-то пишем код для программистов, пользователю вообще не нужно знать, что там что-то работает - ему нужен результат.
24 1dvd
 
19.09.16
13:07
(20) +1
(21) не пойму чего тебе не нравится
25 Torquader
 
19.09.16
13:11
(24) Просто, (20) нужно заворачивать в цикл.
Просто, к сожалению, состояние не одной переменной определяется - If-ы будут вложенные.
В общем, я понял, всем нравится (20) - значит, в коде будет (20) - по крайней мере, если кто-то встретит, все будут понимать, что тут происходит.

А вот над (22) и (23) подумаем на будущее - программируемый исполнитель - это тоже очень хорошо.
26 Garykom
 
гуру
19.09.16
13:15
(25) Ну вот изобрел бизнес процессы и диаграммы
27 Garykom
 
гуру
19.09.16
13:16
(26)+ Если 8-ка то кстати бизнес-процессы пойдут на ура, это в 77 повозиться пришлось бы
28 Torquader
 
19.09.16
13:19
(26) Карта маршрута бизнет-процесса доступна только в конфигураторе - пользователи ей только пользуются.
29 Fragster
 
гуру
19.09.16
14:02
(28) а мужики-то не знают...
30 Torquader
 
19.09.16
15:29
(29) Бизнес-процесс - это МНОЖЕСТВО процессов, каждый из которых может находиться в каком-то состоянии, согласно маршруту.
Понятно, что через неё можно описать автомат или её саму рассматривать как автомат, но изменение состояния процесса - запись в базу данных - точно не быстрая операция.
Ошибка? Это не ошибка, это системная функция.