2016-03-24 30 views
1

請看下面的Lua腳本。在Lua腳本中共享函數變量

想法是,在改變狀態之前,通過調用「getStateFlag()」並賦值給「status」變量來獲得當前狀態。方法ChangeState1或ChangeState2可以更改當前狀態。因此,稍後在調用ResetStatus方法時,可以通過分配存儲的「status」值來重置爲舊狀態。

但問題是,這種「狀態」變量總是設置爲0。

function Start() 
    status = 0 
    local flag = getStateFlag() 
    if(flag == 1) then 
     status = getCurrentStatus() 
     ChangeState1() 
    else if(flag == 2) then 
     status = getCurrentStatus() 
     ChangeState2() 
    else 
     ResetStatus(status) 
    end 
end 

function ChangeStatus1() 
    device::set_value(1) 
end 

function ChangeStatus1() 
    device::set_value(2) 
end 

function ResetStatus(status) 
    device::set_value(status) 
end 
+0

考慮編輯你的問題來描述你正在運行的環境(這聽起來像某種嵌入式處理器?)。如果其他用戶有經驗,他們可能有想法。 – solublefish

回答

0

但問題是,這種「狀態」變量總是設置爲0。

首先你應該分開兩個不同的值 - 以前保存的狀態,以及getCurrentStatus()獲得的當前狀態。現在,您將它們混合在單個變量中,每次輸入Start()函數時都會將其初始化爲0。當您不詢問當前狀態(即標誌不是1或2)時,您實際上會用status=0分配銷燬先前保存的值。

+0

該腳本將在點擊按鈕上運行。所以,每次腳本運行時,它都會像這樣聲明status = 0。任何其他方式來保持這個值不變? – Roe

1

因此,如果我正確理解您的問題,您將多次致電Start()。 如果flag等於1或2要存儲的當前狀態值,然後將裏面ChangeState1()ChangeState2() 否則你想status被重置爲從上次通話價值Start() 被改變,但是目前這將是0每當你撥打Start()而沒有flag是1或2.

所以基本上你只想在status初始化爲0123時,它還沒有被定義。

可以在裏面開始()做的是這樣的:

status = status or 0 

所以,如果status是零,則默認爲0,否則將保持不變。

或者你只是初始化函數外部的狀態。

更簡潔的解決方案是將備份狀態與ChangeState1或ChangeState2更改的值分開。 因此,只有在您要備份或想要恢復時才能訪問您的backupStatus變量。否則你使用一些currentStatus變量。

+0

當我點擊一個按鈕時,這個完整的腳本會每次運行。所以,如果狀態有價值,那麼它在下次執行時不應該賦值爲0 ...有什麼辦法嗎? – Roe

+1

@Roe按照我的解釋做。 – Piglet

+0

我已經嘗試了狀態=狀態或0 ...但狀態值始終爲0。我認爲狀態的值在每次腳本運行時都會初始化。 – Roe

0

根據Piglet答案中的註釋,聽起來這裏的問題是您的運行時環境正在刪除或清除每次運行之間的全局變量。你可以通過在Start()開頭打印狀態值來驗證它(假設你有一些方法來獲得輸出)。如果它總是零,那麼這是一個非常好的指標,你每次都會失去全局狀態。

如果您的環境中出現這種情況,那麼您必須找到另一種方法來存儲運行狀態。您可以訪問特定於該平臺的文件系統或某些外部存儲。