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
DEFINE MENO="text"
DEFINE MENO1="text", MENO2="text"- Text je vždy v úvodzovkách, aj keď je to číslo:
DEFINE WIDTH="20". - Viac mien naraz sa oddeľuje čiarkou. Deklarácia môže pokračovať na ďalšom riadku.
- Všade, kde prekladač v programe nájde
MENO, dosadí namiesto neho text – ako keby si ho tam napísal sám. - Mená z
DEFINEsa zvyčajne píšu veľkými písmenami, aby sa odlíšili od premenných.
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:
; 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)
RETURNPreklad a spustenie
action26 define.act --simČo uvidíš
A box of WIDTH by HEIGHT
####################
# #
# #
####################
Characters in the box: 80Ako to funguje
WIDTHaHEIGHTsú čísla.FOR x=1 TO WIDTHprekladač číta akoFOR x=1 TO 20.FRAMEje znak:Put(FRAME)jePut('#).STRINGnahrádza dve slová naraz.STRING title=…jeCHAR ARRAY title=…. TentoDEFINEje medzi programátormi v Action! bežný zvyk – nájdeš ho v mnohých starých programoch.- V reťazcoch sa nenahrádza. Text
"A box of WIDTH by HEIGHT"sa vypíše tak, ako je. Úvodzovky chránia svoj obsah. - Podmienka
y=1 OR y=HEIGHT OR x=1 OR x=WIDTHplatí pre prvý a posledný riadok a prvý a posledný stĺpec – teda pre okraj.
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
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
- Zmeň rozmery škatule a znak rámu.
- Pridaj
DEFINE INSIDE="'."a vyplň ním vnútro škatule namiesto medzery. - Vyskúšaj pascu so
SIZE– so zátvorkami aj bez nich.
Zhrnutie
DEFINE MENO="text"– prekladač všade nahradí meno textom.- Text je vždy v úvodzovkách.
- Nezaberá pamäť a nedá sa meniť za behu.
- V reťazcoch sa nenahrádza.
- Výpočet v
DEFINEpatrí do zátvoriek.
Späť: 16. Kde premenná platí · Ďalej: 18. Polia