Instrukcje while
Instrukcja while służy do zapętlenia zbioru
instrukcji do momentu spełnienia określonego warunku.
Instrukcja while umożliwia powtarzanie zbioru operacji,
dopóki podany warunek nie będzie miał wartości true. Instrukcja while w języku IPL jest taka sama, jak używana w językach
programowania takich jak C, C++ i Java.
Składnia instrukcji while to słowo kluczowe
while, po którym następuje wyrażenie boolowskie w nawiasach. Po tym wyrażeniu znajduje się blok instrukcji w nawiasach klamrowych.
while (warunek) { instrukcje }
gdzie warunek to wyrażenie boolowskie, a
instrukcje to grupa złożona z jednej lub wielu instrukcji. Na
przykład:
I = 10;
while(I > 0) {
Log("Wartość I wynosi: " + I);
I = I - 1;
}
Gdy w strategii zostanie napotkane słowo kluczowe while,
zostaje przeprowadzone wartościowanie wyrażenia boolowskiego w celu określenia,
czy ma ono wartość prawda. Jeśli wartością wyrażenia jest true, zostaną
wykonane instrukcje w następującym po nim bloku.
Po wykonaniu instrukcji produkt
Netcool/Impact ponownie
testuje wyrażenie i kontynuuje ciągłe wykonywanie bloku instrukcji, dopóki
wartością warunku nie będzie false.
Najczęstszą metodą użycia instrukcji while jest budowa
pętli wykonywanej określoną ilość razy w zależności od innych czynników
w strategii. Aby użyć w ten sposób instrukcji while, należy
skorzystać ze zmiennej całkowitej jako licznika. Wartość licznika zostaje
ustawiona przed rozpoczęciem pętli while i jest zmniejszana
wewnątrz pętli. Instrukcja while testuje wartość licznika przy każdym wykonaniu
pętli i kończy działanie w momencie osiągnięcia przez licznik wartości zero.
Poniższy przykład przedstawia proste użycie instrukcji
while:
Counter = 10;
while (Counter > 0) {
Log("Wartość Counter wynosi " + Counter);
Counter = Counter - 1;
}W przykładzie do zmiennej o nazwie Counter
zostaje przypisana wartość 10. W instrukcji while
strategia testuje wartość zmiennej Counter, aby sprawdzić, czy
jest ona większa od zera. Jeśli wartość zmiennej Counter jest
większa od zera, wykonywane są instrukcje umieszczone w podanym bloku. Końcowa
instrukcja w bloku zmniejsza wartość zmiennej Counter o jeden. Pętla while w tym przykładzie jest wykonywana 10 razy.
Po uruchomieniu tego przykładu w dzienniku strategii zostanie zapisany następujący komunikat:
Wartość Counter wynosi 10
Wartość Counter wynosi 9
Wartość Counter wynosi 8
Wartość Counter wynosi 7
Wartość Counter wynosi 6
Wartość Counter wynosi 5
Wartość Counter wynosi 4
Wartość Counter wynosi 3
Wartość Counter wynosi 2
Wartość Counter wynosi 1W poniższym przykładzie przedstawiono sposób wykorzystania instrukcji while do iterowania elementów tablicy. Ta technika jest często używana przy obsłudze elementów danych pobieranych ze źródła danych.
MyArray = {"Jeden", "Dwa", "Trzy", "Cztery"};
Counter = Length(MyArray);
while (Counter > 0) {
Index = Counter - 1;
Log(MyArray[Index]);
Counter = Counter - 1;
}Przed rozpoczęciem pętli while ustawiono dla zmiennej
Counter liczbę elementów tablicy. Instrukcja while powtarza w
pętli blok instrukcji jeden raz dla każdego elementu tablicy. Dla zmiennej
Index jest ustawiana wartość zmiennej Counter minus jeden. Jest to spowodowane
indeksowaniem od zera tablic w języku IPL. Oznacza to, ze wartość indeksu dla
pierwszego elementu tablicy wynosi 0, a nie 1.
Po uruchomieniu tego przykładu w dzienniku strategii zostanie zapisany następujący komunikat:
Cztery
Trzy
Dwa
JedenW tych przykładach przy korzystaniu z tej metody iterowania elementów tablicy dostęp do elementów jest uzyskiwany w odwrotnej kolejności. Aby tego uniknąć, można w pętli zwiększać zmienną licznika zamiast zmniejszania jej. Wymaga to sprawdzania w pętli while, czy licznik jest mniejszy od liczby elementów w tablicy.
Poniższy przykład przedstawia sposób sprawdzania tablicy w pętli ze zwiększaniem zmiennej licznika.
MyArray = {"Jeden", "Dwa", "Trzy", "Cztery"};
ArrayLength = Length(MyArray);
Counter = 0;
while (Counter < ArrayLength) {
Log(MyArray[Counter]);
Counter = Counter + 1;
}Po uruchomieniu strategii umieści ona w dzienniku strategii następujący komunikat:
Jeden
Dwa
Trzy
CzteryWHILE nie zostanie spełniony. Wtedy strategia
zapętli się, co może powodować problemy z brakiem pamięci. Aby temu zapobiec, do pliku NCI_server.props można dodać właściwość
maxloopsize. Przykład: impact.policy.maxloopsize=50
Jeśli pętla
WHILE w strategii IPL zostanie wykonana więcej razy, niż wynosi wartość parametru
maxloopsize, pętla
WHILE w strategii zostanie przerwana, a w pliku
impactserver.log zostanie zarejestrowany następujący błąd:
ERROR [IPLImpactActionInterpreterVisitor] The policy:
myWHILELoop has looped more than 50 times!