3.4.4   Uzivanie registrov
Ani kompiler ani compilovany kod  nepouzivaju  zdvojujuci  subor
registrov, IY register alebo I alebo R register. Tieto  registre
su pouzite v/v systemom Spectra a  specialne  IY  register  musi
vzdy ukazovat na ERR_NR.
Kompiler a kompilovany kod umoznuju beh s preruseniami.
Ukazovatel  zasobnika  (SP)  je  pouzity  normalne  a    sposoby
odkladania mozu  byt  pozorovane.  Ako  je  opisane  vyssie,  IX
register je pouzity ako ukazovatel casti. HL  register  obsahuje
hodnotu vyrazu, specialne vysledok funkcie. BC, A a  F  registre
su pouzivane ako vseobecne pracovne registre.
3.4.5   Ukladanie dat
Su tri druhy ukladania dat: konstanty, staticke a automaticke.
Odkladaci priestor pre konstanty je sucastou generovaneho kodu;
sem patria cisla , znaky a retazce.
Staticke ulozenie je pouzite pre globalne ( externe ) premenne a
pre vsetky staticke premenne. Tento priestor je  umiestneny  tak
ze zacina na vrcu pamate na RAMTOPe a pracuje smerom nadol.
Zasobnik je pod statickou  pamatou  a  ked  je  to  nutne  ,  je
presunuty nadol. Staticka pamat je pristupna priamo  adresovanim
v kompilovanych instrukciach.
Automaticka pamat sa pouziva pre automaticke lokalne premenne  ,
argumenty  a  linkovanie  funkcii,  a  pre  docasnu  pamat.   Je
umiestnena na zasobniku a pristupna pouzitim SP a IX.
Pamat pre jednotlive premenne je umiestnena tym  istym  sposobom
bez ohladu na to ci je pouzita automaticka alebo staticka pamat.
Najprv su ukladane zakladne typy , potom odvodene:
char      1 byte
int       2 byte, menej vyznamny byte je na nizsej adrese
unsigned  2 byte,   - " -
pointer   2 byte,   - " -  . Obsahuje adresu ukazovaneho objektu
array     n * s byte , kde n je velkost  pola  a  s  je  velkost
                       kazdeho elementu. Prvy element a[0] je na
najnizsej adrese. S viacrozmernym polom ako  je  napr.  a[m][n]
sa naklada ako s polom  velkosti  m  poli  s  ktorych  kazde  ma
velkost n a pozostava z elementov. Takze v pripade  pola  znakov
je element a[i][j] umiestneny na adrese a+n*i+j
structure s byte,  kde  s  je  sucet  velkosti  vsetkych  clenov
                   struktury.  Clen    struktury,    ktory    je
deklarovany ako prvy je umiestneny na nizsej  adrese  (Kernighan
Ritchie).
union     S byte, kde s  je  maximum  velkosti  vsetkych  clenov
                  zmesi. Vsetky cleny zmesi budu umiestnovane na
dolnej adrese (  t.j.  ziadny  nadbytocny  priestor  nebude  pre
specialny clen na vrchu zmesi).
3.4.6   Obsadenie pamati
Kompiler aj samostatne programy sa ukladaju od  adresy  25200  a
tam sa do noch aj vstupuje. Tato adresa nechava priestor pod
sebou valny pre 2 kanaly microdrive resp. 1 kanal  microdrive  a
jeden pseudokanal pre mgf. Je to tiez priestor  pre  VELMI  maly
basicovsky program.
Kopiler pouziva priestor az do RAMTOP a  kvoli  ochrane  presuva
RAMTOP dole pod seba. To znaci ze  je  nevyhnutne  CLEARovat  do
vyssej hodnoty ak chceme pouzivat Spectrum znovu  pre  BASIC  po
opusteni kompileru.
Prelozene programy pouzivaju pamat od 25200 do RAMTOP ,  ktoreho
hodnota bola nastavena predtym ako  kompiler  prelozil  program.
Avsak tieto programy same nemozu hybat RAMTOPom.
            5. C H Y B Y
Chyby su pri pisani programu  dolezite  a  nevyhnutne.  V  tejto
kapitole prediskutujeme chyby vseobecne,potom uvedieme  detailny
zoznam chybovych hlaseni, ktore moze kompilator vytvorit a ich
vyznam.  Napokon  prediskutujeme  niektore bezne chyby v C  pro-
gramoch a ich nasledky.
5.1 Uvod
Ked poziadate kompilator aby skompiloval Vas program, prelistuje
ho a zisti rozne konstrukcie, ktore ste vytvorili  a  vygeneruje
pre ne prislusny kod.Pritom moze najst chybu vo Vasom  programe.
Ak kompilator najde chybu,vypise taketo chybove hlasenie:
ERROR nn
text chyboveho hlasenia
Toto hlasenie ma tri casti.Prve slovo ERROR Vam len  oznamuje,ze
ide o chybove hlasenie. Po druhe,cislo chyby "nn"  oznami,co  je
podla kompilatora zle a umoznuje Vam  najst  viac  informacii  o
chybe v nasledovnom odseku tohto manualu.Po tretie  je  to  text
chyboveho hlasenia,ktory je strucnou indikaciou  priciny  chyby.
V mnohych pripadoch to bude vsetko,co potrebujete na zistenie co
je zle a ako to napravit.
Po vypisani chyboveho hlasenia bude kompilator cakat na  stlace-
nie akejkolvek klavesy a vrati sa do pracovneho rezimu  (sign-on
message).
Texty chybovych hlaseni pocitaca  zaberaju  znacnu  cast  pamate
pocitaca (asi dva kilobyty) a to mozno lahko napravit. Riadok:
#error
sposobi,ze kompilator vymaze chybove hlasenia a da tuto pamat na
vseobecne pouzitie,takze mozte pisat vacsie programy.Ked to kom-
pilator vykonal,chybove hlasenie vyzera nasledovne:
ERROR nn
Jediny sposob,ako dostat spat chybove hlasenia,je  znovu  nahrat
kompilator.Mozte sa samozrejme divat na cisla chyb v tejto kapi-
tole.
Niektore chybove  hlasenia  su  dosledkom  chyby  v  postupnosti
napisanych  znakov  (napr.  chybajuca  bodkociarka).  Casto   sa
nazyvaju chyby SYNTAXe.Iny typ chyb vyplyva z nespravneho pouzi-
tia jazyka a tieto sa volaju semanticke chyby (napr. pokus  pri-
radit hodnotu identifikatoru  pola).Kompilator  nerobi  rozdiely
medzi tymito druhmi chyb.
Treti typ chybovych hlaseni sa zjavi,ked je program pre kompila-
tor privelky.To su HRANICE kompilatora a su identifikovane  slo-
vom "LIMIT" na zaciatku textu  chyboveho  hlasenia.Boli  zvolene
tak,ze velka vacsina programov  sa  skompiluje  bez  dosiahnutia
limity.Ak narazite na limitu,pokuste sa skratit  prislusnu  cast
programu.Dalsie detaily sy uvedene pre kazdu limitu  samostatne.
Stvrty typ chybovych hlaseni sa objavi,ak pisete legalnu C  kon-
strukciu,ktora nieje v tomto kompilatore implementovana.Toto  sa
vola OBMEDZENIE a je to indikovane slovom RESTRICTION na zaciat-
ku textu chyboveho hlasenia.Detaily o  obmedzeniach  su  uvedene
v kapitole Odkazy na jazyk (Language Reference)  tohto  manualu.
Niektore obmedzenia mozu byt zrusene v buducich verziach  kompi-
latora.
Piaty druh chyb su chyby kompilatora. Dufame,ze budu  zriedkave,
ale uvedieme tu radu pre pripad,ze nejaku najdete.Moze byt indi-
kovana chybovym hlasenim, zacinajucim slovom  COMPILER  alebo  s
cilom,nenachadzajucim  sa  v  zozname,uvedenom  dalej.O   tychto
chybach sa neuvadzaju ziadne detaily,lebo sa mozu  cas  od  casu
menit.Vyplyvaju  z  vnutornych  kontrol   kompilatora.Samozrejme
chyba kompilatora sa nemusi spravat tak pekne,ze vytvori chybove
hlasenie,ale  moze  sposobit   spadnutie    kompilatora    alebo
zacyklenie atd.Ak si myslite,ze toto  nastalo,najprv  to  skuste
znovu po opatovnom nahrani kompilatora z kazety v pripade,ze bol
poruseny.Ak tento problem pretrvava,prosim skontaktujte HISOFT -
radi Vam pomozeme.Bude lahsie pomoct Vam,ak mate jasno v podrob-
nostiach.
Zoznam chybovych hlaseni
5.2 ERROR - 0 - missing 'x'
Toto je dost specialne hlasenie,pretoze znak 'x' sa moze  menit.
Sprava vravi,ze kompilator sa domnieva,ze v texte by mal  nasle-
dovat isty znak - a nenasleduje. Prikladom je chybajuca  ';'  na
konci prikazu alebo chybajuca ')' pri volani funkcie.Treba davat
pozor,aby sa spravne porozumelo hlaseniu.Kompilator cita program
od zaciatku a nemoze vidiet  zvysok  programu  za  miestom,ktore
dosiahol,takze na zaklade toho, co doteraz videl musi sa rozhod-
nut,ake chybove hlasenie vydat.Toto  obmedzenie  spolu  s  nasou
tuzbou spravit kompilator pokialmozno najmensi znamena,ze sprava
moze vyzerat cudne pre cloveka,vidiaceho cely program.
Napriklad ak napisete f(a b); tak kompilator vypise "missing ')'
"  after  the  "a".Vysvetlenie  je  dlhsie,ale  jasne:kompilator
vie,ze kompiluje zoznam argumentov funkcie  a  zacne  kompilovat
prvy argument - vyraz "a".Potom precita nasledujuce "b"  a  roz-
hodne,ze prvy argument  sa  uz  skoncil,lebo  vo  vyraze  nemozu
nasledovat dve premenne (musia mat medzi sebou + alebo iny  ope-
rator).Dalej ak je v  zozname  viac  argumentov,musi  nasledovat
ciarka a ak nieje,kompilator usudi ,ze dosiel na koniec  zoznamu
argumentov.Na konci takeho zoznamu musi byt ')' -  ale  namiesto
toho je tam "b".Kompilator vygeneruje spravu "chybajuca ')'".
5.3  ERROR - 1 - RESTRICTION ; floats not implemented
Bohuzial! Pohybliva radova ciarka neimplementovana.
5.4  ERROR - 2 - bad character constant
Zly  konstantny  charakter.  Kompilator  nenasiel   uzavierajuci
apostrof '. Porovnajte syntax v  kapitole  "Language  Reference"
alebo v Kernighan a Ritchiem.
5.5  ERROR - 3 - not a preprocessor command
Nieje prikaz preprocesora.Riadok vyzera ako prikaz  preprocesora
(zacina *),ale nieje z tych,ktore preprocesor uznava. Vid  kapi-
tola "Language Reference".
5.6  ERROR - 4 - LIMIT; macro buffer full
Plna pamat pre makra. Je snahou,aby sa pri beznom  pouziti  tato
hranica nedosiahla.Kompilator ma pamat,kde si  pamata  definicie
z riadkov *define . Teraz je pamat plna. Pokuste sa  zjednodusit
definicie makier.Uvedomte si,ze tuto chybu moze sposobit kruhova
definicia makra.
5.7  ERROR - 5 - can only define identifiers as macros
Iba identifikatory mozno definovat  ako  makra.Vid  Kernighan  a
Ritchie,co je dovolene v riadku #define.
5.8  ERROR - 6 - RESTRICTION: macros may not have parameters
Kompilator vie narabat len s makrami,ktore nemaju parametre (t.j
tie,ktore mozno priamo nahradit).Pripadne ste sa  mohli  pokusit
pouzit nahradny text v zatvorkach a nevynechali potrebne miesto:
#define FIFTH_ELEMENT(array+4)   /* nieje C */
#define SIXTH_ELEMENT (array+5)  /* je C - zatvorka je niekedy
                                    uzitocna */
5.9   ERROR - 7 - cannot open file
Nemozno otvorit subor.Kompilator nemoze najst vstupny subor.
5.10  ERROR - 8 - RESTRICTION: cannot nest includes
Nemoze zretazit  zavadzanie.Kompilator  poskytuje  jednu  uroven
#include pre hlavny program a druhu pre subory hlaviciek,funkcii
a kniznic.Tieto subory uz nemozu obsahovat dalsi uroven #include
5.11   ERROR - 9 - missing 'while'
Chyba 'while'.Na konci prikazu "do" musi byt slovo "while":
    do prikaz while (vyraz) ;
Kompilator ocakava while a nenasiel ho.
5.12   ERROR - 10 - not in loop or switch
Nieje v slucke alebo prepinaci.Prikaz "break" sa pouziva na opu-
stenie prikazu switch alebo slucky ako  "do"  ci  "while"  alebo
"for". "Break" nieje vnutri niektorej z nich.
5.13   ERROR - 11 - not in loop
Nieje v  slucke.Prikaz  "continue"  sa  pouziva  pre  navrat  na
zaciatok slucky ako "do","while"  alebo  "for"."Continue"  nieje
vnutri niektorej z nich.
5.14   ERROR - 12 - not in switch
Nieje v prepinaci."Case" a "default" zavadzaju operacie s jedno-
tlivymi hodnotami v prikaze  "switch".Nemozno  ich  pouzit  mimo
switchu.
5.15   ERROR - 13 - LIMIT: too many case statements
Privela prikazov case.Naraz moze byt aktivnych maximalne 50 pri-
kazov "case"."Case" je aktivny,ak sa objavi pred koncom switchu,
ktory ho uzaviera.Postupnost niekolkych prikazov switch umoznuje
obist tuto limitu.Napr.:
switch(c) { case 'a':...; case 'b':...;}   switch(c) { case 'd':
...;}
5.16   ERROR - 14 - multiple default statements
Viacero "default" prikazov. Kazdy  prikaz  switch  moze  mat  vo
vnutri iba jeden prikaz default.
5.17   ERROR - 15 - goto needs a label
Goto vyzaduje navestie. Kazdy prikaz goto musi mat niekde v tele
tej istej funkcie zodpovedajuce navestie.
5.18   ERROR - 16 - multiple use of identifier
Viacnasobne pouzitie  identifikatora.  Identifikator,  ktory  je
pouzity ako navestie prikazu ,  alebo  ako  navestie  v  prikaze
"goto", nemoze byt pouzity ako meno premennej  (ci  uz  lokalnej
alebo globalnej v tej istej funkcii ako navestie). Konverzia  je
tiez mozna.
5.19   ERROR  -  17  -  direct  execution  not  possible  when
                          translating
Priame vykonavanie nie je mozne pocas prekladu.  Ked  prekladate
program pre samostatne pouzitie nie je mozne pouzivat #direct.
5.20   ERROR - 18 - LIMIT: plna tabulka mien (menny zoznam)
Kompiler ma tabulku,  ktora  obsahuje  mena  vsetkych  aktivnych
premennych, makier, navesti  programu.  Tato  tabulka  je  teraz
plna. Globalne premenne a makra (t.j. #define  mena  )  zaberaju
miesto od okamihu deklaracie az do konca  programu  ale  lokalne
premenne zaberaju miesto iba pocas kompilacie funkcii v  ktorych
sa vyskytuju. Takze redukovanie poctu globalnych premennych bude
setrit miesto . Tak isto rozdelenie rozlahlych funkcii na dve  a
viac mensich , ktore neobsahuju tolko premennych.