2011-03-27 32 views
4

我试图使用Erlang/ets通过模式匹配接收到的数据来存储/更新各种信息。下面是代码无法在接收块中使用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,巴从播放机的方向和标志的角度和球。

发送方进程正在发送这些信息。这里,模式匹配工作正常我通过打印A,Fcd,Fca等等的值来检查。我相信使用Erlang/ets有问题。

当我运行这段代码,我得到错误这样

Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}] 

可有人告诉我有什么不对的代码,以及如何解决这个问题?

回答

7

问题是,ets-table的所有者是运行start/1函数的进程,并且ets的默认行为是only allow the owner to write and other processes to read,也就是protected。有两种解决方案:

  1. 创建ETS表作为公共

    S = ets:new(test,[public]). 
    
  2. 将业主到新创建的过程

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

的文档give_away/3

+0

如何使erlang函数公开? – Megha 2014-11-07 11:27:54