Проблема с созданием процесса - PullRequest
1 голос
/ 01 апреля 2011

Я создаю автостоянку с 2-мя въездными воротами и 1-й, через которую вы можете покинуть парк.Для меня все выглядит хорошо, но я получаю ошибки вроде

Error in process <0.84.0> with exit value: {badarg,[{parking,car,2},{random,uniform,0}]}

Мой код:

-module (parking2).
-export ([start/3]).
-export ([car/2, parkingLoop/1]).

carsInit(0, _Iterations) ->
    ok;
carsInit(Number, Iterations) ->
    spawn(parking, car, [Number, Iterations]),
    carsInit(Number - 1, Iterations).

car(_ID, 0) ->
    ok;
car(ID, Iterations) ->
    Gate = random:uniform(2),
    parking ! {enter, self()},
    receive
        error ->
            io:format("Car ~B ncanot enter - there is no free place.~n", [ID]),
            Time = random:uniform(1000),
            timer:sleep(Time),
            car(ID, Iterations);
        ok ->
            io:format("Car ~B entered through the ~B gate~n", [ID, Gate])
    end,
    StopTime = random:uniform(500) + 500,
    timer:sleep(StopTime),
        parking ! {leave, self(), ID},
        FreerideTime = random:uniform(1000) + 500,
    timer:sleep(FreerideTime),
    car(ID, Iterations - 1).

parkingInit(Slots) ->
    spawn(parking, parkingLoop, [Slots]).

parkingLoop(Slots) ->
    receive
        {enter, Pid} ->
            if Slots =:= 0 ->
                Pid ! error
            end,
            Pid ! ok,
            parkingLoop(Slots - 1);
        {leave, Pid, ID} ->
            io:format("Car ~B left the car park.", [ID]),
            parkingLoop(Slots + 1);
        stop ->
            ok
    end.    


start(Cars, Slots, Iterations) ->
    parkingInit(Slots),
    carsInit(Cars, Iterations).

Кто-нибудь может мне помочь?Я изучаю Эрланг пару дней и не знаю, что здесь не так.

Заранее спасибо, Радек

1 Ответ

6 голосов
/ 01 апреля 2011

В приведенном вами примере используется неверный модуль в вызове spawn/3:

spawn(parking, parkingLoop, [Slots]).

Это должно работать лучше (или, по крайней мере, дать более актуальную ошибку), если вы измените это на:

spawn(?MODULE, parkingLoop, [Slots]).

(Всегда используйте ?MODULE, который является макросом, который оценивает текущее имя модуля при выполнении таких действий, так как это позволит избежать многих ошибок при использовании неправильного модуля, чем предполагалось).

Ошибка возникает из-за того, что вы не зарегистрировали процесс parkingLoop. Вы пытаетесь отправить ему сообщение, используя parking ! ..., но ни один процесс не называется parking. Измените строку 33 на:

register(parking, spawn(parking2, parkingLoop, [Slots])).

(Даже здесь вы можете использовать макрос ?MODULE, чтобы избежать проблем в будущем: ?MODULE ! ... и register(?MODULE, ...), поскольку у вас есть только один процесс с этим именем)

Кроме того, ваш оператор if в строке 38 пропускает сквозное предложение. Сделайте так, чтобы обрабатывать случай, когда Slots равно , а не равно нулю:

if 
    Slots =:= 0 ->Pid ! error;
    true -> ok
end,

(выражение ok не будет действовать, поскольку возвращаемое значение оператора if не используется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...