我正在尝试使用Erlang / ets通过匹配接收数据的模式来存储/更新各种信息。这是代码
start() ->
S = ets:new(test,[]),
register(proc,spawn(fun() -> receive_data(S) end)).
receive_data(S) ->
receive
{see,A} -> ets:insert(S,{cycle,A}) ;
[[f,c],Fcd,Fca,_,_] -> ets:insert(S,{flag_c,Fcd,Fca});
[[b],Bd,Ba,_,_] -> ets:insert(S,{ball,Bd,Ba})
end,
receive_data(S).
这里A是循环数,[f,c]是中心标志,[b]是球和Fcd,Fca,Bd,Ba是来自玩家的旗帜和球的方向和角度。
发件人进程正在发送这些信息。这里,模式匹配正常工作我通过打印A,Fcd,Fca..etc的值来检查。我相信使用Erlang / ets有问题。
当我运行此代码时,我得到这样的错误
Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]
有人能告诉我这段代码有什么问题以及如何解决这个问题吗?
答案 0 :(得分:7)
问题是ets-table的所有者是运行start/1
函数的进程,而ets的默认行为是only allow the owner to write and other processes to read,也就是受保护。两种解决方案:
将ets表创建为公共
S = ets:new(test,[public]).
将所有者设置为新创建的流程
Pid = spawn(fun() -> receive_data(S) end,
ets:give_away(test, Pid, gift)
register(proc,Pid)