[erlang-questions] Newbie problems with gen_fsm

Oliver Korpilla Oliver.Korpilla@REDACTED
Sun May 15 19:33:37 CEST 2016


Hello,

When I see this:

awaiting_payment({payment, Amount}, From, {Price, Paid}) when Amount >= (Price - Paid) ->
  io:format("~p paid ~p", [From, Amount]),
  Change = Amount + Paid - Price,
  {next_state, valid_ticket, {change, Change}, {Price, Price}};

There are too many elements in the tuple returned.

  | {next_state,NextStateName,NewStateData}
  | {next_state,NextStateName,NewStateData,Timeout}
  | {next_state,NextStateName,NewStateData,hibernate}

You are allowed to return these when selecting next_state as your return value. But you return a 4-tuple instead of a 3-tuple.

If one of these is a reply back to the original requestor, then you need:

{reply,Reply,NextStateName,NewStateData}

Also, not 100% sure, but:

init(Price) ->
  {ok, awaiting_payment, {Price, 0}}.


I think it has to be:

init([Price]) ->

because init/1 takes the start_link params as a list.

Sorry, no Erlang system under my fingertips to test. Hope this helps.

Cheers,
Oliver 
 

Gesendet: Sonntag, 15. Mai 2016 um 16:26 Uhr
Von: TA <tobias.ammann@REDACTED>
An: "Erlang Users' List" <erlang-questions@REDACTED>
Betreff: [erlang-questions] Newbie problems with gen_fsm

Hello,
 
I wrote some code for a parking meter to understand how gen_fsm works. There are two states (awaiting_payment, valid_ticket), two input messages (payment, cancel_ticket), and three output messages (unpaid, change, refund).
 
I'm getting the following error and don't understand what's wrong. Any pointers?
 
Error:
** exception exit: {{function_clause,[{gen,do_for_proc,
                                           [{ok,<0.40.0>},#Fun<gen.0.132519590>],
                                           [{file,"gen.erl"},{line,252}]},
                                      {gen_fsm,sync_send_event,2,
                                               [{file,"gen_fsm.erl"},{line,219}]},
                                      {ticketing_fsm,demo1,0,
                                                     [{file,"ticketing_fsm.erl"},{line,25}]},
                                      {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]},
                                      {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                                      {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
                                      {shell,eval_loop,3,[{file,"shell.erl"},{line,626}]}]},
                    {gen_fsm,sync_send_event,[{ok,<0.40.0>},{payment,100}]}}
     in function  gen_fsm:sync_send_event/2 (gen_fsm.erl, line 223)
     in call from ticketing_fsm:demo1/0 (ticketing_fsm.erl, line 25)
 
Source: https://transfer.sh/M7n3b/ticketing-fsm.erl
 
Tobias_______________________________________________ erlang-questions mailing list erlang-questions@REDACTED http://erlang.org/mailman/listinfo/erlang-questions[http://erlang.org/mailman/listinfo/erlang-questions]



More information about the erlang-questions mailing list