Š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:
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é).
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í.
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 |
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 |
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 |