23. Program vo viacerých súboroch: INCLUDE a SET

Na čo to je

Rutiny, ktoré sa hodia do viacerých programov, nechceš zakaždým kopírovať. Dáš ich do vlastného súboru a program si ho vloží príkazom INCLUDE. Tak vzniká vlastná knižnica.

Druhá polovica kapitoly je o SET – pokyne, ktorým sa v starých programoch nastavuje prekladač.

INCLUDE: ako sa to píše

Action!
INCLUDE "D:MENO.ACT"

Prekladač na tomto mieste prečíta celý súbor MENO.ACT, akoby bol jeho text napísaný priamo tu. Potom pokračuje ďalším riadkom.

Celý program

Knižnica – súbor examples/shapes.act:

Action!
; A small library: routines that draw with characters.
; This file is not a program of its own. Other programs INCLUDE it.

PROC ShapeLine(BYTE width, CHAR c)
  BYTE i

  FOR i=1 TO width
  DO
    Put(c)
  OD
  PutE()
RETURN

PROC ShapeBox(BYTE width, height, CHAR c)
  BYTE row

  FOR row=1 TO height
  DO
    ShapeLine(width, c)
  OD
RETURN

Program – súbor examples/include.act:

Action!
; A program in two files

INCLUDE "D:SHAPES.ACT"       ; the routines of shapes.act are now known

PROC Main()
  ShapeLine(12, '=)
  ShapeBox(6, 2, '#)
  ShapeLine(12, '=)
RETURN

Preklad a spustenie

Prekladá sa len hlavný program. Knižnicu si nájde sám:

action26 include.act --sim

Čo uvidíš

============
######
######
============

Ako to funguje

Keď prekladač narazí na INCLUDE "D:SHAPES.ACT", otvorí shapes.act, preloží obe procedúry a vráti sa do include.act. Pre Main sú potom ShapeLine a ShapeBox známe, ako keby boli v tom istom súbore nad ňou.

Mená v knižnici začínajú rovnakým slovom (Shape…). Action! nemá oddelené priestory mien – všetky rutiny všetkých vložených súborov sú na jednej hromade. Spoločná predpona bráni tomu, aby sa meno z knižnice zrazilo s menom v programe.

Knižnica v inom priečinku

Keď knižnice držíš na jednom mieste pre viac programov, povedz prekladaču voľbou -I, kde má hľadať:

action26 include.act -I C:\Atari\lib --sim

Volieb -I môže byť viac. Program sa pritom nemení – v zdrojáku ostáva INCLUDE "D:SHAPES.ACT".

Do pamäte sa dostane len to, čo treba?

Nie celkom. Rutiny z knižnice jazyka (Print, Graphics …) action26 pribalí len tie, ktoré program volá. Rutiny z tvojho vloženého súboru sa preložia všetky, aj nepoužité. Veľkú knižnicu sa preto oplatí deliť do menších súborov.

SET: nastavenie prekladača

Action!
SET adresa=hodnota

Pôvodný Action! bežal na Atari a jeho nastavenia boli bajty v pamäti. SET počas prekladu zapísal hodnotu na danú adresu a tým prekladač prestavil. action26 týmto zápisom rozumie.

Stretneš najmä túto dvojicu – hovorí, od ktorej adresy má byť program v pamäti:

Súbor examples/set.act:

Action!
; SET: this program is placed at address $5000 instead of $2000

SET $E=$5000
SET $491=$5000

PROC Main()
  Print("This routine starts at address ")
  PrintCE(Main)
RETURN
action26 set.act --sim
This routine starts at address 20480

20480 je desiatkovo $5000. Bez dvoch riadkov SET by program začínal na $2000 (8192).

Vo vlastných programoch SET nepotrebuješ. To isté spraví voľba prekladača --org $5000 alebo riadok ;@ORG $5000 na začiatku zdrojáka (kapitoly 32 a 33). Dobré je SET poznať, aby ťa v cudzom programe neprekvapil.

Časté chyby

Čo sa staloČo povie prekladač
vkladaný súbor neexistuje alebo je indeerror ACT203: INCLUDE file not found: D:SHAPES.ACT
INCLUDE je až pod rutinou, ktorá knižnicu voláerror ACT008: undeclared name
ten istý súbor vložený dvakráterror ACT006 – rutiny sú deklarované dvakrát
súbor vkladá sám seba, priamo alebo cez iný súborerror ACT204

Vyskúšaj si

  1. Pridaj do shapes.act procedúru ShapeTriangle(BYTE size, CHAR c) a zavolaj ju z programu.
  2. Presuň shapes.act do podpriečinka lib a prelož program s voľbou -I lib.
  3. Zmeň v set.act adresu na $3000. Akú adresu program vypíše?

Zhrnutie

Späť: 22. Bity · Ďalej: 24. Pamäť počítača