无法在接收块中使用Erlang/ets

无法在接收块中使用Erlang/ets,erlang,Erlang,我试图使用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,_

我试图使用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..等值进行检查。我认为使用Erlang/ets有问题

当我运行这段代码时,会出现如下错误

Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]
进程中存在错误,退出值为:{badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]

有人能告诉我此代码有什么问题以及如何纠正此问题吗?

问题是ets表的所有者是运行
start/1
功能的进程,ets的默认行为是to,也称为protected。两种解决方案:

  • 将ets表创建为公共

    S = ets:new(test,[public]). 
    
  • 将所有者设置为新创建的进程

    Pid = spawn(fun() -> receive_data(S) end, 
    ets:give_away(test, Pid, gift)
    register(proc,Pid)
    

  • 有关

    如何公开erlang函数的文档?