36. Rozšírenia pre dáta: viacrozmerné polia, špeciálne znaky, dlhé texty
Aj táto kapitola je o rozšíreniach action26 – každý program začína riadkom ;@modern (kapitola 35).
Viacrozmerné polia
Na čo to je
Šachovnica, mapa hry, tabuľka – dáta, ktoré majú riadky a stĺpce. V pôvodnom Action! sa to robí jedným dlhým poľom a výpočtom indexu riadok*šírka+stĺpec. S rozšírením napíšeš dva indexy a výpočet spraví prekladač.
Ako sa to píše
BYTE ARRAY grid(4,6) ; 4 riadky, 6 stĺpcov
grid(2,5)=7 ; riadok 2, stĺpec 5
Rozmery sú čísla alebo konštanty. Indexy idú v každom rozmere od 0. Rozmerov môže byť aj viac ako dva.
Celý program
Súbor examples/m-grid.act:
;@modern
; A two-dimensional array: rows and columns
CONST ROWS=4, COLS=6
BYTE ARRAY grid(ROWS,COLS)
PROC Main()
BYTE r, c
FOR r=0 TO ROWS-1
DO
FOR c=0 TO COLS-1
DO
grid(r,c)=(r+1)*(c+1)
OD
OD
FOR r=0 TO ROWS-1
DO
FOR c=0 TO COLS-1
DO
IF grid(r,c)<10 THEN
Put(' )
FI
PrintB(grid(r,c))
Put(' )
OD
PutE()
OD
Print("Row 2, column 5: ")
PrintBE(grid(2,5))
RETURNaction26 m-grid.act --sim 1 2 3 4 5 6
2 4 6 8 10 12
3 6 9 12 15 18
4 8 12 16 20 24
Row 2, column 5: 18Ako to funguje
Dve vnorené slučky – vonkajšia po riadkoch, vnútorná po stĺpcoch – sú bežný spôsob, ako prejsť celú tabuľku. V pamäti ležia prvky riadok za riadkom: grid(r,c) je prvok číslo r*COLS+c.
Počiatočné hodnoty sa píšu ako jeden rad v tomto poradí:
BYTE ARRAY glider(3,3)=[0 1 0 0 0 1 1 1 1]Na rozdiel od jednorozmerných polí tu prekladač stráži aspoň to, čo vie: nesprávny počet indexov a index daný číslom mimo rozmeru sú chyby prekladu (ACT238). Index z premennej sa nekontroluje ani tu.
Keď pole odovzdáš rutine ako parameter, rutina dostane len adresu a vidí ho ako jednorozmerné.
Špeciálne znaky v texte: \{…}
Na čo to je
Niektoré znaky sa do zdrojáka nedajú napísať z klávesnice PC: koniec riadka uprostred textu, inverzné písmo, pípnutie, pohyb kurzora. S rozšírením ich zapíšeš menom.
Ako sa to píše
| Zápis | Čo vloží |
|---|---|
\{RETURN} | koniec riadka |
\{CLEAR} | vymazanie obrazovky |
\{UP} \{DOWN} \{LEFT} \{RIGHT} | pohyb kurzora |
\{BELL} | pípnutie |
\{TAB}, \{ESC}, \{DELETE}, \{INSERT} | príslušné riadiace znaky |
\{$41} | znak s daným kódom |
\{INV:text} | text inverzným písmom |
\{SCREEN:text} | text prevedený na kódy pre priamy zápis do pamäte obrazovky |
Platí v reťazcoch aj v znakových konštantách ('\{RETURN}).
Celý program
Súbor examples/m-escapes.act:
;@modern
; Special characters written by name
PROC Main()
Print("First line\{RETURN}Second line\{RETURN}")
Print("The letter with the code $41: \{$41}\{RETURN}")
IF 'A='\{$41} THEN
PrintE("'A and '\{$41} are the same character")
FI
RETURNaction26 m-escapes.act --simFirst line
Second line
The letter with the code $41: A
'A and 'A are the same characterAko to funguje
Jeden Print vypíše dva riadky, lebo text obsahuje koniec riadka. Text s \{RETURN} vypisuj cez Print, nie PrintE: PrintE skončí pri prvom konci riadka, ktorý v texte nájde.
Inverzné písmo, pípnutie a pohyb kurzora uvidíš a počuješ len v emulátore – skús Print("\{CLEAR}\{INV: TITLE }\{BELL}").
Dlhé texty: PrintU
Na čo to je
Reťazec v Action! má najviac 255 znakov, lebo jeho dĺžka je v jednom bajte. Úvodný text hry alebo návod býva dlhší. PrintU vypisuje text, ktorý nemá dĺžkový bajt a končí dohodnutým znakom.
Ako sa to píše
PrintU("dlhý text", znak)
PrintU(adresa, znak)
PrintU(adresa, znak, najviac)Druhý parameter je ukončovací znak – taký, ktorý sa v texte nevyskytuje. Keď je text napísaný priamo vo volaní, prekladač ukončovací znak na jeho koniec doplní sám. Tretí, nepovinný parameter obmedzí počet vypísaných znakov.
PrintUD(kanál, …) robí to isté na kanál (kapitola 30).
Celý program
Súbor examples/m-longtext.act:
;@modern
; PrintU: a text longer than 255 characters
PROC Main()
PrintU("Action! was written by Clinton Parker and published by Optimized Systems Software in 1983. It came on a cartridge with an editor, a compiler and a monitor. Programs in Action! run many times faster than programs in Atari BASIC, and they are far shorter than the same programs written in assembler.", '~)
PutE()
RETURNaction26 m-longtext.act --simAction! was written by Clinton Parker and published by Optimized Systems Software in 1983. It came on a cartridge with an editor, a compiler and a monitor. Programs in Action! run many times faster than programs in Atari BASIC, and they are far shorter than the same programs written in assembler.Ako to funguje
Text má 297 znakov – do obyčajného reťazca by sa nezmestil. PrintU ho vypisuje od začiatku, kým nenarazí na znak ~. Rovnako vypíše text, ktorý program načítal zo súboru do poľa, ak si na jeho koniec zapíše ukončovací znak.
Časté chyby
| Čo sa stalo | Čo povie prekladač |
|---|---|
nesprávny počet indexov (grid(1)) | error ACT238: 'grid' has 2 dimensions and needs 2 indexes, got 1 |
| index daný číslom mimo rozmeru | error ACT238: index 4 is outside 0..3 of dimension 1 of 'grid' |
preklep v mene znaku (\{RETRUN}) | error ACT240: unknown escape so zoznamom platných mien |
| ukončovací znak je aj vnútri textu | error ACT007: the text contains its stop byte |
text nad 255 znakov mimo PrintU | error ACT001 |
Vyskúšaj si
- Zmeň tabuľku na 9 × 9 – malú násobilku.
- Deklaruj pole 3 × 3 s počiatočnými hodnotami a vypíš ho.
- V emulátore vypíš nadpis inverzným písmom a pod ním dlhý text cez
PrintU.
Zhrnutie
BYTE ARRAY a(riadky, stĺpce)je pole s dvoma indexmi; prekladač prepočíta index sám.\{MENO}v texte vloží znak, ktorý sa nedá napísať:\{RETURN},\{CLEAR},\{INV:text}…PrintU(text, znak)vypíše text ľubovoľnej dĺžky ukončený daným znakom.
Podrobnejšie: lekcie 12, 14 a 15 v examples/modern/.
Späť: 35. Rozšírenia jazyka · Ďalej: 37. Miesto v pamäti a assembler