m Funkcia sa konci ak "control" retazec bol vycerpany , alebo
niektory vstup nesuhlasi so specifikaciou a potom vracia pocet
spravnych vstupov . Ked bol najdeny koniec suboru potom EOF.
Priklad:
int n;
char s[20];
scanf("%d ,%19s",&n,s);
prikaz cita cele cislo do premennej n (&n) a retazec dlhy max.
20 znakov do pola s. Vsimnite si : limitovanie poctu vstupnych
znakov %19s,premenna s neobsahuje & lebo je tiez ukazatelom do
pola
4.46 int fscanf(fp,control,arg,...)
FILE *fp;
char *control;
Funkcia sa chova ako scanf , ale vstup sa robi z "fp"
4.47 int sscanf(s,control,arg,....)
char *s,*control;
Funkcia sa chova ako scanf , ale vstup sa berie z retazca "s" C SKUPINA
4.48 int rewin()
Vstup jedneho znaku z klavesnice bez konverzie a bez
echa.Funkciacaka na nastavenie 5 bitu v systemovej premennej
FLAGS a potom cita obsah premennej LAST_K (skupina 1)
4.49 int keyhit()
Funkcia dodava TRUE ak bola zatlacena lubovolna klavesa a
FALSE ak nebola. AK dodala TRUE potom mozeme zistit ktory znak
bol stlaceny pomocou rawin() . Pred opatovnym pouzitim keyhit
musime klavesnicu inicializovat (skupina 1)
4.50 _exit(n)
Tato funkcia sposoby navrat do systemu . Argument je cislo
spravy ,ktora sa ma vytlacit (exit(0) je o.k. exit(4) je Out
of memory ....)
FUNKCIE 32 BITOVEJ ARITMETIKY
32 bitove cislo je pole o 4 znakov pricom najmenej dolezity byte
je prvy a najdolezitejsi je posledny
4.51 long_multiply(c,a,b)
char *a,*b*,*c;
Vykona c= a*b
4.52 long_add(c,a,b)
char *a,*b,*c;
Vykona c= a+b
4.53 long_init(a,n1,n0)
char *a;
unsigned n1,n0;
Inicializuje 32 bitove cislo n1 su dolezitejsie byty a n0
menej dolezite.
long-init(a,Ox1234,Ox5678); "a"=Ox123456789
4.54 long_set(a,n,d)
char *a;
unsigned n,d;
Inicializuje 32 bitove cislo n udava 16 bitove cislo a d
hovori kam sa ma umiestnit.
long_set(a,Ox1234,1); "a"=00123400
long_set(a,Ox5678,3); "a"=78000000
4.55 long_copy(c,a)
char *c,*a;
Kopiruje 32 bitove cislo c=a PSEUDO NAHODNE CISLA
Generator aplikovany v kniznici je prebraty z "learnig to
Program in C" (Thomas Plum). generuje 16 bitove cisla s
periodou 2^32. Cize cisla sa opakuju po 2^32 krat ,preto nebudte
sklamany pri jeho spusteni
4.56 int rand()
Vracia 16 bitove cislo s periosou 2^32m
4.57 int srand(n)
Nastavuje generator. Pouziva sa na zaciatku prace s generatoro
m aby kazde spustenie bolo ine (zacina od inej zakladnej
hodnoty
GRAFICKE A ZVUKOVE FUNKCIE PRE SPECTRUM
Tieto funkcie su neni v standarte C kniznice a dovoluje vyuzit
vsetky prednosti pocitaca .
4.58 plot(on,x,y)
int on,x,y;
Funkcia nastavuje bod na lokacii (x,y) ,bud na nastaveny ink
alebo PAPER podla hodnoty "on" , ak je TRUE potom sa nastavy
INK inac PAPER.
4.59 line(on,dx,dy)
int on,dx,dy;
Funkcia nakresli ciaru z nastaveneho bodu do bodu (x+dx,y+dy)
prepinac "on" sa chova obdobne ako pri plot
4.60 int ink(color)
int color;
Meni nastaveny INK na hodnotu colour . Ak je colour mimi
rozsah potom funkcia vracia -1,inac vrati hodnotu nastaveneho
INK
4.61 int paper(colour)
int colour;
Meni hodnotu PAPER ako ink().
4.62 cls()
Vymaze obrazovku.
4.63 beep(d,p)
int d,p;
zabipa pricom d je dlzka tonu v desatinach sekundy a p je jeho
vyska . 3. PRIRUCNY MANUAL HISOFT C JAZYKA
3.1 Rozdiely oproti Kenighanovi a Ritchiemu (existuje rusky
preklad - pozn.prekl.)
Poznamenavame, ze nasledovne obmedzenie nie je inac spomenute:
- Plavajuca desatinna bodka nie je zatial implementovana, co
znaci ze uzitie typov float a double zapricini chybu kompilera
'RESTRICTION: floats not implemented' a kompilacia bude
ukoncena.1. Uvod
Hisoft C je navrhnuty tak aby bol velmi blizky jazyku opisanemu
v knihe Kernighan , Ritchie: The C programing language. Tato
kniha je zakladnou pracou o C, a vsetci uzivatelia Hisoft C by
sa mali snazit urobit si jej kopiu. Pretoze je blizka definicii
C, je Hisoft C blizky tiez inym dialektom C zalozenym na nej.
Vela casti knihy Kernighana a Ritchieho je priamo pouzitych v
Hisoft C a my ich tu neopakujeme. Tato kapitola opisuje rozdiely
medzi Hisoft C a jazykom popisanym v 'C Reference Manual', ktory
je Apendixom A knihy Kernighana a Ritchieho. Tento apendix je
strucnou definiciou jazyka a tato kapitola je strucnou
definiciou odlisnosti. Dalsie objasnenia niektorych aspektov su
dane v inej casti manualu.
Tato kapitola pouziva take iste cislovanie casti ako 'C
Reference Manual' takze komentare mozeme priamo pouzit k
zodpovedajucej casti knihy. Tam kde zahlavie casti nema komentar
je Hisoft C zhodny s opisom v knihe. Teraz zacneme komentarom
sekcie 1...
Hisoft C je implementovany na pocitaci ZX Spectrum, ktory
pouziva mikroprocesor Z80.
2. Lexikalne konvencie
2.1 Komentare
2.2 Identifikatory (Mena)
Externe identifikatory su pouzivane iba pre "forward" deklaraciu
typu funkcie , ostatne identifikatory su take ako opisane.
2.3 Klucove slova (sluzobne)
Ziadne rozdiely.
2.4 Konstanty
2.4.1 Celociselne konstanty
Ziadne rozdiely, ale poznamenavame ze long je to iste ako int
(vid 2.6)
2.4.2 Explicitne dlhe konstanty
ako pre 2.4.1
2.4.3 Znakove konstanty
2.4.4 Konstanty s plavajucou ciarkou
2.5 Retazce
2.6 Charakteristiky hardware
Z80
ASCII
char 8 bitov = 1 byte
int 16 2
short 16 2
long 16 2
float
double
rangePoznamenavame ze short , long, int su jedno a to iste.
3. Notacia syntaxe
4. Co je to meno?
Su dva rozdiely v triedach pamate. Prvy je , ze registrove
premenne su vzdy pokladane za premenne pretoze nie je dost
registrov umoznujucich ulozit premenne! Klucove slovo 'register'
je akceptovane ale ignorovane takze v skutocnosti nie su
rozdiely oproti jazyku ktory akceptuje compiler Hisoft. Druhym
rozdielom je , ze lokalne premenne musia byt deklarovane v
hlavicke tela funkcie a nemozu byt deklarovane v hlavicke
zahniezdeneho prikazu. Toto nie je vazne obmedzenie v praxi a
moze byt obhajene na zaklade lahkeho pocopenia programov - ale
tiez pomaha zachovat maly kompiler!
Su poskytnute vsetky zakladne typy , ale ako bolo poznamenane
hore short je to iste ako long a ako int. Dufame , ze buduce
verzie budu zahrnat 8 bitove premenne short a 32 bitove premenne
long.
5. Objekty a l hodnoty
6. Konverzie
6.1 Znaky a cele cisla
Znamienkove rozsirenie sa neda pouzivat pri prevadzani znakov na
cele cisla, takze znak sa javi ako cislo v rozsahu 0..255.
6.2 Cisla s plavajucou ciarkou a dvojnasobna presnost
Nie su zatial implementovane takze tato cast nema vyznam.
6.3 Plavajuca ciarka a cele cisla
6.4 Ukazovatele a cele cisla
6.5 Cele cisla bez znamienka
6.6 Aritmeticke transformacie
7. Vyrazy
Kompiler vo vseobecnosti pocita vyrazy z vnutra von a zlava do
prava, ale nemozno sa na to spolahnut pri dalsich kompileroch.
Celociselne preplnenie , akym je napr delenie nulou, je
ignorovane.
7.1 Prvotne vyrazy
Argumenty funkcii su vyhodnocovane v poradi z lava do prava a
ukladane do zasobnika po vyhodnoteni. Ako hovori prirucka ,
nemozno sa na to spolahnut. Vid pozn. pri 7.
7.2 Unarne operatory
Syntax operatora konverzie typu je odlisna oproti prirucke kvoli
zjednoduceniu kompilera ( zaroven sa program stava
citatelnejsim). Operator sa vola "cast" a musi byt udany
predefinovany typ alebo " typedef-name" ako argument; nebude
akceptovat anonymne "type-name" ako napr.:(int**()). Na to aby
sme presunuli existujuci C program do kompilera napiste meno v
typedef deklaracii a pridajte slovo cast pred zatvorku.
Na to aby sme skompilovali program pouzivajuci tuto syntax inym
kompilerom treba zadefinovat slovo cast tak aby nic neznamenalo.
Napr:
#define cast
Operator "sizeof" ma podobnu syntax a akceptuje len predefnovany
typ alebo "typedef-name". Neakceptuje neznamy typ alebo vyraz.
Takze syntax je takato:
jednoduchy vyraz:
cast ( typovy specifikator ) vyraz
sizeof ( typovy specifikator )Tieto odlisnosti neobmedzuju programy, ktore maju byt napisane,
ale iba pozaduju, aby boli napisane tymto specialnym sposobom.
7.3 Multiplikativne operatory.
Tento kompilator je podobny kompilatoru opisanemu v manuali, na
ktory sa odvolavame, kde zvysok operatora delenia ma rovnake
znamienko ako podiel. Takze orezanie je smerom k nule.
7.4 Aditivne operatory.
7.5 Posuvne operatory.
Aritmeticky posun sa vykona ked int je posunute vpravo, takze
vysledok ma rovnake znamienko ako povodne. Logicky (zero-fill)
posun sa vykonava, ked bez znamienka (neoznacene) je posuvana
vpravo.