[Помощь новичку] Кодовый замок с правильным порядком ввода цифр.

106 views
Skip to first unread message

Andrey Voronkov

unread,
Dec 6, 2012, 8:10:52 AM12/6/12
to erlang-...@googlegroups.com
Код:

В описании gen_fsm есть пример модуля, реализующего кодовый замок. Но есть у него одна проблема - при старте код должен вводиться в обратном порядке. Т.е code_lock:start_link([2,1]).
А открыть можно:
code_lock:button(1).
code_lock:button(2).
Чтобы этого избежать и задавать код в правильном порядке я в 18 строке я его переворачиваю для проверки. Как сделать лучше?

Илья Аржанников

unread,
Dec 6, 2012, 8:17:05 AM12/6/12
to erlang-...@googlegroups.com
при старте переворачивать?


6 декабря 2012 г., 19:10 пользователь Andrey Voronkov <voron...@gmail.com> написал:

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 



--
с Уважением Аржанников Илья

Max Lapshin

unread,
Dec 6, 2012, 8:27:50 AM12/6/12
to erlang-...@googlegroups.com
Если ты хочешь сыммитировать домофон, то всё таки нужно скорее два процесса:
один накапливает в течении таймаута кнопки от пользователя, другой хранит код.

Проверка осуществляется атомарно списком кнопок.

Если же ты иммитируешь пульт отключения ядерного заряда, то как-то так:


start_link(Codes) -> gen_server:start_link({local,?MODULE},?MODULE,[Codes],[]).

button(Code) -> gen_server:call(?MODULE, {button, Code}).

init([Codes]) -> {ok, Codes}.

handle_call({button, Code}, [Code]) ->
  {stop, normal, {ok, world_saved}, []};

handle_call({button, Code}, [Code|Codes]) ->
  {reply, {ok, next}, Codes};

handle_call({button, Code}, [OtherCode|_] = Codes) ->
  {stop, booom, {error, wrong_code, OtherCode}, Codes}.

terminate(_,_) -> ok.


Aleksandr Vinokurov

unread,
Dec 7, 2012, 5:17:50 AM12/7/12
to erlang-...@googlegroups.com


Лучше описать в документации на API функцию start_link/1 -- в каком порядке она принимает список кодов и в документации на функцию init/1 -- в каком порядке **она** принимает список кодов. После этого разместить lists:reverse/1 в тело start_link/1 либо init/1, но никак не считать lists:reverse/1 от неизменяемого значения при выполнении fsm.

Обычно преобразования во внутренний формат делают в init/1.


2012/12/6 Илья Аржанников <iarzha...@gmail.com>



--
Александр Винокуров
@aleksandrvin

Max Lapshin

unread,
Dec 7, 2012, 8:18:56 AM12/7/12
to erlang-...@googlegroups.com
Лучше описать в документации на API функцию start_link/1 -- в каком порядке она принимает список кодов и в документации на функцию init/1 -- в каком порядке **она** принимает список кодов. После этого разместить lists:reverse/1 в тело start_link/1 либо init/1, но никак не считать lists:reverse/1 от неизменяемого значения при выполнении fsm.

Обычно преобразования во внутренний формат делают в init/1.


Документация на функцию init — это вообще очень неоднозначный совет. Я не могу себе представить ситуацию, когда она потребуется.

Точно так же с проверками: если всё что надо проверить в вызывающем процессе, т.е. в start_link, то упадет тот, кто ответственный за передачу данных. Если же свалится init, то в логах будут неприятные плохочитаемые сообщения, а самое главное, что упадет тот, кто не виноват в ошибке.

Reply all
Reply to author
Forward
0 new messages