2016-03-24 3 views
1

Bitte schauen Sie sich das folgende Lua-Skript an.Freigeben einer Variablen über Funktionen in Lua-Skript

Idee ist, bevor Sie den Status zu ändern, ist den aktuellen Status immer durch den Aufruf „getStateFlag()“ und „Status“ Variablen zugewiesen wird. Die Methoden ChangeState1 oder ChangeState2 können den aktuellen Status ändern. Später, wenn ich die ResetStatus-Methode aufruft, kann ich auf den alten Status zurücksetzen, indem ich den gespeicherten Wert von "status" zuweise.

Aber Problem ist, diese "status" Variable immer setzt auf 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

Sie können Ihre Frage bearbeiten, um die Umgebung zu beschreiben, in der Sie arbeiten (es klingt wie eine Art eingebetteter Prozessor?). Wenn andere Benutzer Erfahrung damit haben, können sie Ideen haben. – solublefish

Antwort

0

Aber Problem ist, diese "status" Variable setzt immer auf 0.

Zunächst alles, was Sie trennen sollten zwei verschiedene Werte - zuvor gespeicherten Status und aktuellen Status erhalten Sie mit getCurrentStatus(). Jetzt mischten Sie beide in eine einzelne Variable, die bei jedem Start der Funktion Start() mit 0 initialisiert wird. Wenn Sie den aktuellen Status nicht fragen (d. H. Flagge ist nicht 1 oder 2), zerstören Sie tatsächlich den zuvor gespeicherten Wert mit status=0 Zuweisung.

+0

Dieses Skript wird bei einem Klick ausgeführt.Jedes Mal, wenn dieses Skript ausgeführt wird, wird Status = 0 zugewiesen, wie ich dies deklariert habe. Eine andere Möglichkeit, diesen Wert konstant zu halten? – Roe

1

Also, wenn ich Ihre Frage richtig verstanden werden Sie Start() mehrmals aufrufen. Wenn flag gleich 1 oder 2 Sie den aktuellen Status Wert gespeichert werden soll und dann wird es innerhalb ChangeState1() oder ChangeState2() Else geändert werden Sie status wollen wieder auf den Wert von Ihrem letzten Aufruf zu Start() aber zur Zeit wird es 0 jeder sein Zeit, die Sie anrufen Start() ohne flag werden 1 oder 2.

Also im Grunde möchten Sie nur status mit 0 initialisieren, wenn es noch nicht definiert ist.

Was Sie in Starten tun können(), ist dies:

status = status or 0 

Also, wenn status null ist es auf 0 ausfällt, sonst wird es unverändert bleiben.

Oder Sie initialisieren einfach den Status außerhalb der Funktionen.

Eine sauberere Lösung wäre, um Ihren Backup-Status von dem Wert zu trennen, die durch ChangeState1 oder ChangeState2 geändert wird. Sie greifen also nur auf Ihre backupStatus-Variable zu, wenn Sie sie sichern oder wiederherstellen möchten. Andernfalls verwenden Sie eine Variable currentStatus.

+0

Dieses vollständige Skript wird jedes Mal ausgeführt, wenn ich auf eine Schaltfläche klicke. Wenn der Status also einen Wert hat, sollte er bei der nächsten Ausführung nicht 0 zugewiesen werden ... gibt es einen Weg? – Roe

+1

@Roe ja, wie ich es erklärte. – Piglet

+0

Ich habe versucht Status = Status oder 0 ... aber der Wert von Status ist immer 0. Ich denke, dass der Wert des Status jedes Mal initialisiert wird, wenn dieses Skript ausgeführt wird. – Roe

0

Basierend auf den Kommentaren in Ferkel Antwort, es klingt wie hier das Problem, dass die Umgebung Ihrer Laufzeit ist, zu löschen oder Ihre globalen Variablen zwischen jedem Durchlauf zu löschen. Sie können dies überprüfen, indem Sie den Wert des Status zu Beginn von Start() drucken (vorausgesetzt, Sie haben eine Möglichkeit, die Ausgabe zu erhalten). Wenn es immer Null ist, ist das ein ziemlich guter Indikator dafür, dass Sie jedes Mal den globalen Zustand verlieren.

Wenn dies in Ihrer Umgebung der Fall ist, müssen Sie eine andere Möglichkeit finden, um den Status in mehreren Läufen zu speichern. Sie haben möglicherweise Zugriff auf ein Dateisystem oder einen externen Speicher, der für die Plattform spezifisch ist.

Verwandte Themen