5.62 ERROR - 60 - LIMIT: no more memory
Uz ziadna pamat.Kompilator vyuziva priesor medzi svojim zaciat-
kom a koncom pamate (RAMTOP) na ukladanie mnohych veci.Drzi sa
tu editovany text, kompilovany strojovy kod Vasho programu a
text chybovych hlaseni,pracovny priestor pre kompilator.Tento
priestor je teraz uplne plny.Mozte ho trochu uvolnit niekolkymi
sposobmi:
- pouzite #error riadok na zrusenie chybovych hlaseni
- nahrajte svoj program na pasku (microdrive) atd a pouzite #in-
clude file
- skompilujte cely program a zbehnite ho,namiesto pouzitia
#direct+
- zjednoduste program
5.63 ERROR - 61 - RESTRICTION: use assignment or move() to
initialize automaticsKompilator nema inicializaciu automatickych lokalnych premen-
nych.Namiesto toho by ste mali jednoducho pouzit priradovaci
prikaz. Uvedomte si,ze mozte inicializovat staticke lokalne pre-
menne a tie by sa mali vyuzivat prednostne miesto automatickych,
okrem rekurzivnych a reentrantnych funkcii.Aby ste
inicializovali velke objekty,ako polia, mozte tiez vytvorit sta-
ticke pole s potrebnymi datami a potom pouzit zabudovanu funkciu
move(),aby ste skopirovali data do automatickej premennej.Uve-
domte si,ze v C nemozte inicializovat automaticke polia a toto
nieje,"RESTRICTION".
Prve nestastia,havarie a ako ich hladat:
1. Pri pouziti indexu pola s chybnym popisom a ulozenim do
lubovolneho miesta pamati. Treba poznamenat, ze C nema
kontrolu popisu.
2. Oznacenie chybnej hodnoty ukazovatela a potom jeho pouzitie
na ulozenie hodnoty do pamati; alebo zvysenie ukazovatela mimo
oblast, na ktoru by mohol ukazovat. Velmi podobne chybam pola.
Hisoft-C skusa predchadzat niektorym chybam kladenim dorazu na
spravne typy.
3. Prejdenie zleho poctu argumentov k funkcii, ked je volana.
Toto moze sposobit havariu pouzitim argumentu, ktory tu nebol,
alebo vychylenie zasobnika,ked sa funkcia vracia. C nekontroluje
pocet argumentov.
4. Volanie premennej ukazovatela funkcie (t.j. (*
ptr_to_func) () ), ktora ma chybnu hodnotu, alebo nebola
inicializovana. Toto je celkom nahodny skok.
5. Volanie funkcie, ktora nebola definovana v priamom mode.
Avsak chybne hodnoty v tychto pripadoch nesmu byt samozrejme:
mozu byt sposobene niektorymi z chyb, opisanych nizsie.
Teraz obecny zoznam pravdepodobnych problemov:
1. Velke pismena su odlisne od nizsich pismen v
identifikatoroch.
2. Skontrolujte, ci su vsetky komentare ukoncene.
3. Skontrolujte, ci su vsetky retazcove premenne ukoncene.
4. Skontrolujte,ci su vsetky premenne inicializovane, zvlast ci
bod ukazovatela ukazuje tam, kde sme predpokladali (t.j. nepise
*ptr = x; pred tym, nez napise ptr = y; ) .
5. POZORNE skontrolujte, ci "= =" je pouzite pre testy rovnosti
a " = " iba pre oznacenie.
6. Pamatajte, ze vsetky polia zacinaju indexom 0. Pole oznace-
ne ako a[N] ma prave N prvkov iducich od indexu 0 po index N-1.
7. Nazov pola vyhodnocuje ukazovatel pola a nesposobuje
zvlast, ze kopia pola nie je funkciou.
8. Nejestvuju ziadne uplne oznacenia pola alebo struktury. Toto
musi byt robene prvok za prvkom ( alebo vstavanin funkcie "move"
do kniznice ). Osobitne test ( a = = b ), kde "a" a "b" su
polia , testuje, ci maju rovnaku zakladnu adresu, nie ten isty
obsah. Test ( s = = "text") je takmer vzdy chybny.
9. Pamatajte, ze lokalne premenne a argumenty funkcii su
rozmiestnene na vrchole zasobnika a su odlozene az kym sa
funkcia nevykona.
10. Vsetky argumenty funkcii sa zadavaju hodnotou. Explicitny
ukazovatel musi byt pouzity na zadavanie premenneho parametra.
11. Skontrolujte pocet a typy argumentov, pouzitych vo
funkciach , ak doteraz neboli skontrolovane.
12. Skontrolujte, ci su ukazovatele tam, kde treba (tak, ze ar-
gument moze byt zameneny funkciou). Moze sa vyzadovat operator &
13. Vzdy ked funkcia nema ziadne argumenty, musi mat " () " po
svojom mene, aby sa vyvolala. Toto bude normalne zachytene ako
typova chyba, ale prikaz : func_with_no_args ;
sposobi, ze adresa funkcie bude vyhodnotena a odhodena.
Zavolanie funkcie je mozne jedine prikazom :p
func_with_no_args () ; 14. Pamatajte, ze typy funkcii navratu mozu byt menene
automaticky pravidlami C. Najma int moze byt oseknuty na char
15. Pamatajte, ze hodnota konca suboru EOF (end-of-file) je
-1 a nemoze byt testovana voci premennej char , pre vysledok
getcher, getc ... musi byt pouzity int.
16. Skontrolujte, ci je vhodne --i alebo i--. Osobitne treba
poznamenat, ze normalna slucka o N razoch iduca od 0 po N-1 sa
pise ako: for ( i=0; i<N; ++i ) do_something ();
17. Pamatajte, ze zvysenie ukazovatela sposobi, ze jeho binarna
hodnota vzrastie o velkost objektu, na ktory ukazuje, tak ze
ukazuje na nasledujuci objekt v poli. Zvlast treba pamatat, ze
ukazovatel na "int" rastie o dva byty naraz. Tiez nezabudnite
ze nejaka hodnota pripocitana k ukazovatelu bude nasobena
velkostou predchadzajuceho objektu.
18. Aritmeticke pretecenie nie je chybou a nezistuje sa testom.
Niekedy moze byt uzitocne, ale treba explicitne zahrnut kontrolu
ak treba.
19. Retazec je ukazovatelom pola charakterov (je adresa). Na
retazce nemozno pouzit testy rovnosti podobne Pascalovmu.
Osobitne si dajte pozor na pisanie " x ", ked mate namysli 'x'.
Prve je adresa dvojbytoveho pola a druhe je ASCII hodnota
charakteru.
20. Retazec ma nulovy byt na konci. Pamatajte na to pri vypocte
dlzky pola a nezabudnite tam jeden polozit, ak vas program
pracuje s retazcami.
21. Niekedy moze byt vyhoda operatorov prekvapujuca.
Skontrolujte pribuzne operacie ( == < atd. ) a pamatjte, ze
operatory posuvu maju menej vyhod ako scitanie tak ze
(hi<<8+10) nema ten vyznam, ako by sa zdalo.
22. Poradie vyhodnocovania vyrazu NIE je presne urcene a NIKDY
sa nan nemozme spoliehat.
23. "if" bezprostredne predchadza "else".
24. Vykonavanie preteka cez prikaz case do nasledujuceho.
Break je potrebne vypustit z prikazu switch.
25. Ak sa premenna "switch" nehodi k ziadnemu vyrazu "case",
potom je prikaz obteceny.
26. Medzi riadiacimi prikazmi (while, if, for) a prikazmi a
prikazmi, ktore ich riadia nie je ziadna bodkociarka. Na druhej
strane, uplnost prikazu je kontrolovana.
27. je prirodzene chybou koncit #definovany riadok bodkociarkou
28. Vsetky argumenty funkcie scanf musia byt ukazovatelmi. To
znamena, ze musia byt ADRESAMI premennej, kde vysledok je
vlozeny do pamati.
5