Działanie pętli "While..."

andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Działanie pętli "While..."

Post autor: andrzej-n »

1.Jak rozumiem działanie pętli "While", instrukcje zawarte wewnątrz są realizowane dopóki nie zostanie spełniony określony warunek.Dopiero po spełnieniu warunku program wychodzi z pętli wykonywane są instrukcje zapisane poniżej.
Zatem w takim przypadku (jak niżej) zmiana urządzenia "w" powinna nastąpić dopiero w momencie wjazdu loka do bloku b6.
W rzeczywistości wyjście z pętli i zmiana urządzenia "w" następuje wcześniej. Czy ja znowu coś nie zauważam?
rys8.jpg
2.Czy wyjście z pętli "While" może nastąpić przed spełnieniem warunku, jeśli wewnętrzna instrukcja w tym przypadku dot Uruchomienia Rozkładu jazdy zakończyła sie wcześniej?
rys9.jpg
Załączam też plik .plansza. Zdarzenia zapisane są dla "u4" i "u6"
Załączniki
STY 2017 ver.2.plansza
(1.92 MiB) Pobrany 186 razy
Andrzej
Awatar użytkownika
gbbsoft
Admin
Posty: 2179
Rejestracja: 09 lip 2008, 23:19
Miasto: Warszawa
System DCC: Lenz + Roco

Re: Działanie pętli "While..."

Post autor: gbbsoft »

Propozycja: wstaw w środku pędli while blok "Czekaj" z parametrem np.: 0.5sek, bo zamęczysz komputer...
Taka pętla while działa non-stop aż do zakończenia na 100% procesora nic nie robiąc...
Awatar użytkownika
gbbsoft
Admin
Posty: 2179
Rejestracja: 09 lip 2008, 23:19
Miasto: Warszawa
System DCC: Lenz + Roco

Re: Działanie pętli "While..."

Post autor: gbbsoft »

andrzej-n pisze: 15 mar 2017, 18:44 1.Jak rozumiem działanie pętli "While", instrukcje zawarte wewnątrz są realizowane dopóki nie zostanie spełniony określony warunek.Dopiero po spełnieniu warunku program wychodzi z pętli wykonywane są instrukcje zapisane poniżej.
Moim zdaniem jest odwrotnie: pętla while wykonuje się dopóki spełniony jest warunek. Jak przestaje być spełniony, to program opuszcza pętlę.

Słowo "while" można tłumaczyć jako "podczas gdy"

Przykład:
i=0
while i<5
i=i+1
end while

Powoduje policzenie od 0 do 4. Pętla jest opuszczana, gdy i=5

PS. To co ty opisujesz w różnych językach programowania nazywa się "until", ale tego u nas nie ma.
andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Re: Działanie pętli "While..."

Post autor: andrzej-n »

Skoro "
Moim zdaniem jest odwrotnie: pętla while wykonuje się dopóki spełniony jest warunek. Jak przestaje być spełniony, to program opuszcza pętlę.
"
to przy takim ustawieniu warunku program powinien wyjść z pętli w momencie wjazdu loka do bloku b6. (zdarzenie dla urządzenia u4)
rys10.jpg
A tymczasem program w ogóle do pętli nie wchodzi. Jak zamienię warunek na "this.Engine.BlockByName("X").CurrentTrainStatus == GbbEngine.Block.TrainStatuses.StopOrMissing" to program do pętli wchodzi i opuszcza ją kiedy Rozkład jazdy zmienia status na "Stopped" pomimo, że lok do bloku b6 jeszcze nie dojechał.
Andrzej
Awatar użytkownika
gbbsoft
Admin
Posty: 2179
Rejestracja: 09 lip 2008, 23:19
Miasto: Warszawa
System DCC: Lenz + Roco

Re: Działanie pętli "While..."

Post autor: gbbsoft »

To może ustalmy najpierw o co w ogóle chodzi w tym małym programiku.
Właczasz u4 i co ma się dziać?
andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Re: Działanie pętli "While..."

Post autor: andrzej-n »

Uruchamiany jest Rozkład jazdy "3-3>". Po wjechaniu loka do bloku b6 ma się zmienić urządzenie "w". Wiem, że można zapisać zdarzenie bezpośrednio w bloku, ale mnie zależy na użyciu pętli while.
Andrzej
andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Re: Działanie pętli "While..."

Post autor: andrzej-n »

Załączam jeszcze plik .plansza byś mógł to prześledzić
Załączniki
STY 2017 ver.2.plansza
(1.93 MiB) Pobrany 205 razy
Andrzej
Awatar użytkownika
gbbsoft
Admin
Posty: 2179
Rejestracja: 09 lip 2008, 23:19
Miasto: Warszawa
System DCC: Lenz + Roco

Re: Działanie pętli "While..."

Post autor: gbbsoft »

1. Wyrzuć uruchamianie Rozkładu Jazdy przed pętle. Wystarczy uruchomić raz, a nie milion razy w pętli
2. W petli wstaw opóźnienie (np.: 1sek albo 0.1 sek), bo inaczej komputer ci się niepotrzebnie grzeje
3. Warunek spróbuj taki:

Kod: Zaznacz cały

this.IsNull(this.Engine.BlockByName("b6").CurrentTrain)
PS. Zainstaluj nowszą wersję, bo dodałem funkcję "this.IsNull" aby łatwo było sprawdziać, czy obiekt jest pusty.
andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Re: Działanie pętli "While..."

Post autor: andrzej-n »

Piotrze,
Po zmianie warunku pętla działa poprawnie.
Poprzednie rozwiązania: [ this.Engine.BlockByName("X").CurrentTrainStatus == GbbEngine.Block.TrainStatuses.StopOrMissing oraz this.Engine.BlockByName("x").CurrentTrainStatus != GbbEngine.Block.TrainStatuses.StopOrMissing] nie do końca funkcjonowały dobrze.
Bardzo dziękuję.
Andrzej
andrzej-n
Posty: 209
Rejestracja: 24 lis 2015, 20:48

Re: Działanie pętli "While..."

Post autor: andrzej-n »

Jeszcze spostrzeżenie. Warunek "this.IsNull(this.Engine.BlockByName("b6").CurrentTrain)" działa tylko wtedy kiedy lok jest przypisany do bloku. Warunek nie działa gdy lok jest rzeczywiście w bloku (blok zajety) ale nie jest przypisany. Mnie to na razie nie przeszkadza.
Andrzej
ODPOWIEDZ