2011-03-27 44 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