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

Action!
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:

Action!
;@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))
RETURN
action26 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: 18

Ako 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í:

Action!
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:

Action!
;@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
RETURN
action26 m-escapes.act --sim
First line
Second line
The letter with the code $41: A
'A and 'A are the same character

Ako 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

Action!
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:

Action!
;@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()
RETURN
action26 m-longtext.act --sim
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.

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 rozmeruerror 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 textuerror ACT007: the text contains its stop byte
text nad 255 znakov mimo PrintUerror ACT001

Vyskúšaj si

  1. Zmeň tabuľku na 9 × 9 – malú násobilku.
  2. Deklaruj pole 3 × 3 s počiatočnými hodnotami a vypíš ho.
  3. V emulátore vypíš nadpis inverzným písmom a pod ním dlhý text cez PrintU.

Zhrnutie

Podrobnejšie: lekcie 12, 14 a 15 v examples/modern/.

Späť: 35. Rozšírenia jazyka · Ďalej: 37. Miesto v pamäti a assembler