下面的Erlang代码运行在Eclipse上:
%% @author gakuo
%% @doc @todo Add description to links.
-module(links).
%% ====================================================================
%% API functions
%% ====================================================================
-export([start/1, test/1,middle/2]).
%% ====================================================================
%% Internal functions
%% ====================================================================
start(N)->
register(first,spawn_link(links,make,[N-1])).
make(0)->
last();
make(N)->
middle(spawn_link(links,make,[N-1]),N).
middle(Next,N)->
receive
Msg->
Next ! Msg,
io:format("Process ~w received ~w~n",[N,Msg]),
middle(Next,N)
end.
last()->
receive
stop->
io:format("last process now exiting ~n", []),
exit(finished);
Msg->
io:format("last process received ~w ~n", [Msg]),
last()
end.
test(Msg)->
first ! Msg.我的操作如下:
links:start(3).此时,我得到以下错误:
Eshell V9.0.4
(processlinking@GAKUO)1> links:start(3).
** exception exit: undef
in function links:make/1
called as links:make(2)在运行下一个命令(即:
links:test(stop).在这两个命令之后,我期望如下:
Process 2 received stop
Process 1 received stop
Last process now exiting
stop经过一些研究,我发现Undef之所以会出现,是因为在计算函数调用时找不到该函数。对于类似的错误,StackOverflow的进一步研究没有帮助。解决方案涉及升级已安装的Erlang版本,但我的问题似乎是一个合乎逻辑的问题。作为二郎的新手,我无法指出这是什么。一如既往,我们将非常感谢您的帮助。
发布于 2018-03-17 16:28:27
spawn_link (以及其他接受模块名称+函数名+参数列表的函数)只能调用该模块导出的函数。未导出的函数只能从模块内调用,需要在没有模块名称前缀的情况下调用。因此,您需要导出make/1以使该代码工作:
-export([start/1, test/1, middle/2, make/1]).
^^^^^^https://stackoverflow.com/questions/49337812
复制相似问题