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

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

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

Post autor: andrzej-n » 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.
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 25 razy
Andrzej

Awatar użytkownika
gbbsoft
Admin
Posty: 1521
Rejestracja: 09 lip 2008, 23:19
System DCC: Lenz + Roco

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

Post autor: gbbsoft » 15 mar 2017, 21:32

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: 1521
Rejestracja: 09 lip 2008, 23:19
System DCC: Lenz + Roco

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

Post autor: gbbsoft » 15 mar 2017, 21:35

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: 198
Rejestracja: 24 lis 2015, 20:48

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

Post autor: andrzej-n » 20 mar 2017, 13:17

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: 1521
Rejestracja: 09 lip 2008, 23:19
System DCC: Lenz + Roco

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

Post autor: gbbsoft » 20 mar 2017, 13:28

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: 198
Rejestracja: 24 lis 2015, 20:48

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

Post autor: andrzej-n » 20 mar 2017, 15:53

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: 198
Rejestracja: 24 lis 2015, 20:48

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

Post autor: andrzej-n » 20 mar 2017, 16:07

Załączam jeszcze plik .plansza byś mógł to prześledzić
Załączniki
STY 2017 ver.2.plansza
(1.93 MiB) Pobrany 28 razy
Andrzej

Awatar użytkownika
gbbsoft
Admin
Posty: 1521
Rejestracja: 09 lip 2008, 23:19
System DCC: Lenz + Roco

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

Post autor: gbbsoft » 20 mar 2017, 22:42

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: 198
Rejestracja: 24 lis 2015, 20:48

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

Post autor: andrzej-n » 22 mar 2017, 16:51

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: 198
Rejestracja: 24 lis 2015, 20:48

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

Post autor: andrzej-n » 22 mar 2017, 17:21

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