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 1

W 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
Jeden

W 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
Cztery
Uwaga: Czasami występuje możliwość, że warunek pętli WHILE 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!