Š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 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 CurrentVoltage. 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:

  1. Napísať výraz obsahujúci všetky potrebné riadky: napr. H.Struct[1]^Voltage + H.Struct[2]^Voltage + H.Struct[3]^Voltage
  2. 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

Poznámka: nie je podporené vnorenie (LOOP_TEMPLATE_START vnútri LOOP_TEMPLATE_START).


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



Archivované hodnoty

Položky konfiguračného okna