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+jstructure 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 fileNemozno 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
translatingPriame 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.