Š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 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é).
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
Poznámka: nie je podporené vnorenie (LOOP_TEMPLATE_START vnútri LOOP_TEMPLATE_START).
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 |