消息传递时Erlang处理“badarg”错误

消息传递时Erlang处理“badarg”错误,erlang,Erlang,我是Erlang新手,尝试通过消息传递将从一个函数获得的结果传递给另一个函数,但我不确定为什么在执行ie main时它会给我badarg错误!{数字,1100}。我试图做一些更改,如灰显部分所示,但在使用From时消息没有传递。这是我的密码: 如果你从main那里得到一个消息!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况 您可以使用查看已注册的内容。如果您从main获得一个!消息,这

我是Erlang新手,尝试通过消息传递将从一个函数获得的结果传递给另一个函数,但我不确定为什么在执行ie main时它会给我badarg错误!{数字,1100}。我试图做一些更改,如灰显部分所示,但在使用From时消息没有传递。这是我的密码:

如果你从main那里得到一个消息!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况

您可以使用查看已注册的内容。

如果您从main获得一个!消息,这意味着没有在名称main下注册的进程。它要么没有启动,要么一开始就没有正确注册,要么在某个时候就死了。您可以添加更多的print语句来跟踪发生的情况


您可以使用查看注册的内容。

执行此功能:

start_main() ->   
    register(main, spawn(numbers, main, [0,2])).
将启动一个名为main的进程,该进程执行函数number:main/2。函数numbers:main/2开始执行后,它进入一个receive子句并等待消息

如果随后执行函数proc/0,它也将输入一个receive子句并等待消息。如果您向运行proc/0的进程发送一条消息,如{work,1,3},那么proc/0将向numbers:main/2发送一条消息,如{return,6};和数字:main/2将显示一些输出。这是证据:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(numbers).          
{ok,numbers}

2> numbers:start_main().
true

3> Pid = spawn(numbers, proc, []).
<0.73.0>

4> Pid ! {work, 1, 3}.
Processing 1 to 3 
{work,1,3}
Received 6 

5> 

正如您所看到的,没有badarg错误。当你声称某事发生时,你需要用证据来证明,仅仅说某事发生是不够的。

执行此函数:

start_main() ->   
    register(main, spawn(numbers, main, [0,2])).
将启动一个名为main的进程,该进程执行函数number:main/2。函数numbers:main/2开始执行后,它进入一个receive子句并等待消息

如果随后执行函数proc/0,它也将输入一个receive子句并等待消息。如果您向运行proc/0的进程发送一条消息,如{work,1,3},那么proc/0将向numbers:main/2发送一条消息,如{return,6};和数字:main/2将显示一些输出。这是证据:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(numbers).          
{ok,numbers}

2> numbers:start_main().
true

3> Pid = spawn(numbers, proc, []).
<0.73.0>

4> Pid ! {work, 1, 3}.
Processing 1 to 3 
{work,1,3}
Received 6 

5> 

正如您所看到的,没有badarg错误。当你声称发生了什么事情时,你需要用证据来证明,仅仅说发生了什么事情是不够的。

当你向main发送第一条消息时,它由带有消息{numbers,1100}的receive语句处理,在这个语句中,你产生了两次proc函数,并终止了receive语句

因此,主进程死亡,不再注册,一旦proc函数尝试在main行发送消息!{return,Res},您将得到badarg错误


您需要在mainTotal+Result N-1行递归调用main函数,以保持主进程的活动状态。参见RichardC answer

当您将第一条消息发送到main时,它由带有消息{numbers,1100}的receive语句处理,在此语句中生成两次proc函数,并终止receive语句

因此,主进程死亡,不再注册,一旦proc函数尝试在main行发送消息!{return,Res},您将得到badarg错误

您需要在mainTotal+Result N-1行递归调用main函数,以保持主进程的活动状态。参见RichardC的答案