2016-03-24 15 views
1

Lütfen aşağıdaki Lua betiğine bakın.Bir değişken Lua komut dosyasında işlevler arasında paylaşılıyor

Fikir, durumu değiştirmeden önce "getStateFlag()" diyerek ve "status" değişkenine atanarak mevcut durumu alıyorum. ChangeState1 veya ChangeState2 yöntemleri geçerli durumu değiştirebilir. Bu yüzden daha sonra ResetStatus yöntemini çağırırken, "status" değerinin depolanmış değerini atayarak eski duruma sıfırlayabilirim.

Ama mesele bu "durum" değişken her zaman için 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

İçinde bulunduğunuz ortamı açıklamak için sorunuzu düzenlemeyi düşünün (bir çeşit gömülü işlemci gibi görünüyor mu?). Diğer kullanıcıların deneyimleri varsa, fikirleri olabilir. – solublefish

cevap

0

setleri Ama mesele bu "durum" değişken her zaman için 0.

İlk setleri, dur, tüm iki ayrı değeri ayırmanız gerekir - daha önce kaydedilmiş durum ve getCurrentStatus() ile elde ettiğiniz mevcut durum. Artık onları, her biri Start() işlevine girdiğinizde 0 ile başlatılan tek değişkende karıştırdınız. Geçerli durumu sormadığınızda (yani, bayrak 1 veya 2 değilse), daha önce kaydedilmiş değeri status=0 atama ile yok edersiniz.

+0

Bu komut, bir buton tıklaması ile çalışacaktır.Yani, bu betik her çalıştığında, bu gibi beyan ettiğim gibi status = 0 atayarak. Bu değeri sabit tutmanın başka bir yolu var mı? – Roe

1

Sorunuzu doğru bir şekilde anladıysam Start()'u birden çok kez arayacaksınız. flag Eğer mevcut durum değeri saklamak istediğiniz ve o zaman Start() için son çağrısından değerine sıfırlanması status istiyorum ChangeState1() veya Else ChangeState2() içine değişmiş olacak Ama şu anda her 0 olacaktır 1 veya 2 eşittir ise 1 veya 2 olmak üzere Start() aradığınız süre.

Temel olarak, yalnızca tanımlı değilken status'u yalnızca 0 ile başlatmak istiyorsunuz. 0 öntanımlıdır olacak nil status ise aksi takdirde deđiţtirilmez Yani

status = status or 0 

: Eğer Başlat() içine yapabilecekleriniz

budur. Veya durumların dışındaki durumları basitçe başlatırsınız.

Daha temiz bir çözüm, yedek durumunuzu ChangeState1 veya ChangeState2 tarafından değiştirilen değerden ayırmak olacaktır. Bu nedenle, yedeklemek istediğinizde veya geri yüklemek istediğinizde yalnızca backupStatus değişkeninize erişeceksiniz. aksi halde bazı currentStatus değişkenini kullanırsınız.

+0

Bu tam komut dosyası, bir düğmeyi tıklattığımda her defasında çalışır. Yani, eğer statünün değeri varsa, o zaman sonraki infazda 0'a atanmamalı ... herhangi bir yolu var mı? – Roe

+1

@Roe evet açıkladım. – Piglet

+0

Durumunu denedim status = status veya 0 ... ama durum değeri her zaman 0'dır. Bu betiğin çalıştığı her zaman durumunun değerini başlattığını düşünüyorum. – Roe

0

Piglet'in yanıtındaki yorumlara dayanarak, buradaki sorun, çalışma zamanı ortamınızın her bir çalışma arasındaki global değişkenlerinizi silmesi veya temizlemesidir. Durumun değerini Start() 'ın başlangıcında yazdırarak (çıktı almanın bir yolunun olduğunu varsayarak) doğrulayabilirsiniz. Eğer her zaman sıfırsa, her seferinde küresel devleti kaybediyor olman oldukça iyi bir gösterge.

Ortamınızda böyle bir durum varsa, durumları eyalet genelinde depolamanın başka bir yolunu bulmanız gerekir. Bir dosya sistemine veya platforma özel bazı harici depolama alanlarına erişiminiz olabilir.

İlgili konular