17. Mená pre čísla: DEFINE

Na čo to je

Číslo 20 v programe nič nehovorí. WIDTH hovorí, že ide o šírku. DEFINE dá menu text, ktorým ho prekladač pri preklade nahradí. Keď sa šírka zmení, opravíš ju na jednom mieste.

Ako sa to píše

Action!
DEFINE MENO="text"
DEFINE MENO1="text", MENO2="text"

DEFINE nie je premenná. Nezaberá pamäť, nedá sa do neho nič priradiť a za behu programu neexistuje. Je to pokyn pre prekladač: „toto slovo čítaj ako tento text“.

Celý program

Súbor examples/define.act:

Action!
; DEFINE: names for numbers and pieces of the program

DEFINE WIDTH="20",
       HEIGHT="4",
       FRAME="'#",
       STRING="CHAR ARRAY"

PROC Main()
  BYTE x, y
  STRING title="A box of WIDTH by HEIGHT"

  PrintE(title)
  FOR y=1 TO HEIGHT
  DO
    FOR x=1 TO WIDTH
    DO
      IF y=1 OR y=HEIGHT OR x=1 OR x=WIDTH THEN
        Put(FRAME)
      ELSE
        Put(' )
      FI
    OD
    PutE()
  OD

  Print("Characters in the box: ")
  PrintBE(WIDTH*HEIGHT)
RETURN

Preklad a spustenie

action26 define.act --sim

Čo uvidíš

A box of WIDTH by HEIGHT
####################
#                  #
#                  #
####################
Characters in the box: 80

Ako to funguje

Skús zmeniť WIDTH na 30 a HEIGHT na 6: rám, slučky aj výpočet počtu znakov sa prispôsobia samy.

Pasca: DEFINE je text, nie hodnota

Action!
DEFINE SIZE="5+5"
…
PrintBE(SIZE*2)

Vyzerá to ako 10 × 2 = 20, ale vypíše sa 15. Prekladač dosadí text a číta 5+5*2 – a násobenie má prednosť. Keď je v DEFINE výpočet, daj ho do zátvoriek: DEFINE SIZE="(5+5)".

Časté chyby

Čo sa staloČo povie prekladač
číslo bez úvodzoviek (DEFINE N=10)error ACT006: DEFINE expects a string constant with the replacement text
priradenie do mena z DEFINE (WIDTH=5)chyba – prekladač vidí 20=5
DEFINE s menom, ktoré už má premennázrážka mien; veľké a malé písmená sa nerozlišujú, DEFINE HEAD a premenná head je to isté meno

Kde DEFINE platí

DEFINE na začiatku súboru platí do konca súboru. DEFINE napísaný vnútri rutiny platí len do konca tej rutiny.

Vyskúšaj si

  1. Zmeň rozmery škatule a znak rámu.
  2. Pridaj DEFINE INSIDE="'." a vyplň ním vnútro škatule namiesto medzery.
  3. Vyskúšaj pascu so SIZE – so zátvorkami aj bez nich.

Zhrnutie

Späť: 16. Kde premenná platí · Ďalej: 18. Polia