Vypočítané archívy - agregácia hodnôt stĺpcových archívov
Š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 bola implementovaná 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), takže nie sú nutné úpravy vypočítaného archívu.
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 štruktúrovaného archívu, 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 tom prípade sa nahradí počtom riadkov).
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
Poznámka: Nie je podporené vnorenie (LOOP_TEMPLATE_START vnútri LOOP_TEMPLATE_START), ale jeden vypočítaný archív môže obsahovať viacero LOOP_TEMPLATE konštrukcií.
Príklady:
Suma hodnôt zo stĺpca H.Struct^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
_sumHľadanie maxima zo stĺpca H.Struct^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
_maxHľadanie maxima zo stĺpca H.Struct^Voltage (iba riadky 5 - 30)
INIT
REAL _max
_max := H.Struct[5]^Voltage
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