Štandardný vypočítaný archív, ktorý je štruktúrovaný, pracuje nad konkrétnym stĺpcom jednej alebo viacerých štruktúrovaných archívnych objektov.
Príklad výpočtu: Majme štruktúrovanú premennú SV.Struct, ktorá má stĺpce Current a Voltage a je celá archivovaná primárnym štruktúrovaným archívom H.Struct. Majme vypočítaný archívny objekt s výrazom
H.Struct^Current * H.Struct^Voltage
a s rozmerom archívu zadaným ako H.Struct[0]^Current prípadne H.Struct[0]^Voltage, prípadne SV.Struct[0]^Current). Takýto vypočítaný archív bude mať rovnaký počet riadkov ako štruktúrovaná premenná resp. primárny štruktúrovaný archív. Pre jednotlivé riadky sa bude počítať súčin položiek v stĺpcoch Current a Voltage. Napr. pre 3. riadok bude výraz H.Struct[3]^Current * H.Struct[3]^Voltage.
Táto funkcionalita spravidla postačuje, ale čo pokiaľ chceme vypočítať napr. sumu alebo maximum všetkých hodnôt v stĺpci Current? Vzhľadom na to, že pre archívne výrazy nie sú podporené nekonštantné indexy (kvôli optimalizácii výpočtov nemôžeme použiť lokálnu premennú _i a napísať H.Struct[_i]^Voltage), máme 2 možnosti:
- Napísať výraz obsahujúci všetky potrebné riadky: napr. H.Struct[1]^Voltage + H.Struct[2]^Voltage + H.Struct[3]^Voltage
- Použiť LOOP_TEMPLATE syntax
Prvá možnosť je jednoduchá ale prácna (najmä ak má štruktúrovaná premenná väčší počet riadkov), navyše pri zmene rozmeru štruktúrovanej premennej je nutné výrazy ručne upravovať. Preto vznikla druhá možnosť, ktorá v podstate znamená napísanie makra v rámci vypočítaného archívu. Toto makro D2000 Archív rozvinie a skompiluje pri štarte, ale aj automaticky pri zmene rozmeru zdrojových archívov (v dôsledku zmeny rozmeru štruktúrovanej premennej).
Pozn: pri zápise je nutné použiť Rozšírenú syntax pre výrazy (obsahujúcu INIT a FINALLY ako aj podporujúcu lokálne premené).
Syntax LOOP_TEMPLATE
LOOP_TEMPLATE_START #LOOP_TEMPLATE_PAR#, low_range, high_range ;ľubovolný kód, ktorý môže obsahovať #LOOP_TEMPLATE_PAR# ako index, napr. pre implementáciu sumy _sum := _sum + H.Struct[#LOOP_TEMPLATE_PAR#]^Current LOOP_TEMPLATE_END
kde
low_range je konštanta
high_range je konštanta alebo názov štruktúrovaného archívneho objektu
Všetok kód medzi LOOP_TEMPLATE_START a LOOP_TEMPLATE_END sa "rozvinie" pre opakovania #LOOP_TEMPLATE_PAR# od low_range do high_range
Príklady:
Suma hodnôt zo stĺpca Current (je ošetrené spracovanie iba platných hodnôt - viď použitie atribútu \VLD)
INIT REAL _sum LOOP_TEMPLATE_START #LOOP_TEMPLATE_PAR#, 1, H.Struct IF H.Struct[#LOOP_TEMPLATE_PAR#]^Current\VLD THEN _sum := _sum + H.Struct[#LOOP_TEMPLATE_PAR#]^Current ENDIF LOOP_TEMPLATE_END FINALLY _sum
Hľadanie maxima zo stĺpca Voltage
INIT REAL _max _max := H.Struct[1]^Voltage ; inicializacia (predpokladáme, že štruktúra má aspoň 1 riadok) LOOP_TEMPLATE_START #LOOP_TEMPLATE_PAR#, 1, H.Struct IF H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage\VLD & H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage > _max THEN _max := H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage ENDIF LOOP_TEMPLATE_END FINALLY _max
Hľadanie maxima zo stĺpca Voltage (iba riadky 5 - 30)
INIT REAL _max _max := H.Struct[1]^Voltage ; inicializacia (predpokladáme, že štruktúra má aspoň 1 riadok) LOOP_TEMPLATE_START #LOOP_TEMPLATE_PAR# 5, 30 IF H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage\VLD & H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage > _max THEN _max := H.Struct[#LOOP_TEMPLATE_PAR#]^Voltage ENDIF LOOP_TEMPLATE_END FINALLY _max
Súvisiace stránky: