2

こんにちは、私は Erlang を学んでおり、その過程でErlang execises pageから演習を行おうとしています。特に、M メッセージを別のプロセスに送信して終了する 2 つのプロセスを作成する関数を作成する必要があるという問題に取り組んでいます。私はそれで問題を抱えています、これは私のコードです:

-module(roundtrip).
-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    if M =:= 0 ->
        io:format("Bye cruel world!~n")
    end,
    receive
        {From, a_message} ->
            From ! {self(), a_message},
            myProc(M-1);
        _ -> 
            io:format("I don't understand~n"),
            myProc(M)

    end.

start(M) ->
    spawn(?MODULE, myProc, [M]).

トークを呼び出すと、次のエラーが表示されます。

=ERROR REPORT==== 11-Nov-2013::21:21:00 === プロセス <0.46.0> で終了値のエラー: {undef,[{roundtrip,proc,"\n",[] }]}

=ERROR REPORT==== 11-Nov-2013::21:21:00 === プロセス <0.47.0> で終了値のエラー: {undef,[{roundtrip,proc,"\n",[] }]}

私はそれを回っていますが、何が問題なのかわかりません...

ありがとう。

4

2 に答える 2

3

関数をエクスポートする必要がありmyProc/1ます。または、次を使用できますspawn/1

start(M) ->
   spawn(fun() -> myProc(M) end).
于 2013-11-11T22:34:05.070 に答える
3

使用spawn/3するので、エクスポートする必要がありますmyProc

別の問題は、 if 条件が when の他の可能性をカバーしていないことM =/= 0です。私は次のようにします:

-module(roundtrip).

-export([talk/1]).

talk(M) ->
    init(M).

init(M) ->
    P1 = start(M),
    P2 = start(M),
    P2 ! {P1, a_message}.

myProc(M) ->
    case M of
        0 ->
            io:format("Bye cruel world!~n");
        _ ->
            receive
                {From, a_message} ->
                    From ! {self(), a_message},
                    io:format("~p ~p~n", [self(), M]),
                    myProc(M-1);
                _ ->
                    io:format("I don't understand~n"),
                    myProc(M)

            end
    end.

start(M) ->
    spawn(fun() -> myProc(M) end).

caseの代わりにifとのspawn/1代わりに使用したことに注意してくださいspawn/3

于 2013-11-11T22:35:16.123 に答える