X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?a=blobdiff_plain;f=skripta-spa1-sadrzaj.tex;h=a4b637e30f77ce0f522fdd012e6586c6a6a61c71;hb=f8ec0e91229190ae1aff75a73732c3fa05f2ccab;hp=50655d0b7b895274d8d75526f62d0705823c2fd9;hpb=5032b8ef31be8b199297901b7fe1ec2c6dccea37;p=spa1skripta-public.git diff --git a/skripta-spa1-sadrzaj.tex b/skripta-spa1-sadrzaj.tex index 50655d0..a4b637e 100644 --- a/skripta-spa1-sadrzaj.tex +++ b/skripta-spa1-sadrzaj.tex @@ -532,10 +532,19 @@ najadekvatniju za konkretnu primenu. U opštem slučaju definišemo npr: String = ARRAY [1..30] OF CHAR; \end{codeblock} -Operacije nad stringovima se najčešće uvoze iz modula \kod{Str}. One -sve prihvataju \emph{otvorene nizove znakova} (strukture definisane sa -\kod{ARRAY OF CHAR}), tako da im se može proslediti niz proizvoljne -dužine. +Budući da Modula 2 definiše mogućnost korišćenja \emph{otvorenih + nizova}, lako je moguće definisati procedure koje kao parametre +primaju bilo koji tip koji je definisan kao niz znakova. + +\begin{codeblock} + PROCEDURE ObradaStringa(str: ARRAY OF CHAR); +\end{codeblock} + +Konkretne promenljive u programu moraju biti definisane dužine. + +Operacije nad stringovima se najčešće uvoze iz modula \kod{Str} i one +su sve definisane da prihvataju \emph{otvorene nizove znakova} kao što +je malopre objašnjeno. Određivanje stvarne dužine stringa (tj koliko od maksimalnog kapaciteta niza je zapravo zauzeto sadržajem) se može izvesti na @@ -546,13 +555,12 @@ sledeći način: Leksikografsko poređenje dva stringa se ne može vršiti standardnim operatorima kao što su \kod{< > =}. Ovo je delom zato što se radi o -nizovima, a delom i zato što se ne vidi direktno koji deo niza je -popunjen stvarnim sadržajem. Za ovo se koristi komanda \kod{Compare}, -koja prihvata dva stringa kao parametre, a vraća broj koji predstavlja -njihov odnos. Taj broj će biti 0 ako su stringovi jednaki, veći -od nule ako je prvi string ``veći'', i manji od nule ako je prvi -string ``manji''. Ovo se lako pamti kad primetimo da je odnos -između \kod{Compare} i 0 isti kao i između prvog i drugog stringa. +nizovima, ali značajnije i zato što se ne vidi direktno koji deo niza +je popunjen ``stvarnim'' sadržajem. Za ovo se koristi komanda +\kod{Compare}, koja prihvata dva stringa kao parametre, a vraća broj +koji predstavlja njihov odnos. Taj broj će biti 0 ako su stringovi +jednaki, veći od nule ako je prvi string ``veći'', i manji od nule ako +je prvi string ``manji''. \begin{codeblock} IF Compare(str1, str2) > 0 THEN @@ -564,6 +572,9 @@ između \kod{Compare} i 0 isti kao i između prvog i drugog stringa. END; \end{codeblock} +Ovo se lako pamti kad primetimo da je odnos između \kod{Compare} i 0 +isti kao i između prvog i drugog stringa. + Postoji i modul \kod{Strings} koji ima nešto drugačije definisane procedure, no na njih se sada nećemo fokusirati. @@ -644,6 +655,34 @@ pri operacijama otvaranja i zatvaranja fajlova, odnosno neće se pri tome resetovati na \kod{FALSE}, pa na ovo treba obratiti pažnju pri radu. +\subsubsection*{Mogući problemi} + +U ovoj glavi će biti navedeni neki česti problemi koji se mogu desiti +pri korišćenju FIO modula, a koji su vezani za konkretnu +implementaciju u XDS distribuciji kompajlera. + +\paragraph{\kod{RdStr} i drugi pozivi} Prilikom čitanja iz fajlova +može doći do neobičnih rezultata ako se kombinuju pozivi \kod{RdStr} +sa drugima. Problem je u različitom tretiranju separatora. Komanda +\kod{RdStr} uvek čita do kraja reda i pri tome premesti poziciju za +čitanje odmah iza znaka za razdvajanje redova. Ostale komande prvo +preskaču separatore i čitaju sadržaj dok ne naiđu na novi separator +(što može biti novi red, a može biti i razmak, tabulator i neki drugi +znaci) i staju sa čitanjem \emph{pre} tog separatora. Kombinaovanje +ova dva pristupa može dovesti do toga da \kod{RdStr} nakon neke druge +komande učita samo kraj trenutnog reda, a ne sledeći red kao što bi +bilo očekivano. + +\paragraph{EOF i prazan red na kraju fajla} Svako čitanje iz fajla +postavlja \kod{EOF} u skladu sa tim da li je komanda stigla do kraja +fajla ili ne. Nažalost kod svih komandi za čitanje (osim \kod{RdStr}) +postoji problem ukoliko je na kraju prazan red ili neki dodatni +separator. Tada učitavanje poslednjeg elementa nije zapravo došlo do +kraja fajla. Ako se nakon toga proba još jedno učitavanje sa takvom +komandom ona će probati da preskoči separator i da učita neki sadržaj, +ali će se zaglaviti jer ne može da ga nađe. Ovo ponašanje je greška u +implementaciji FIO modula u okviru XDS distribucije. + \subsection{Zadatak: ispis sadržaja fajla na ekran} @@ -663,9 +702,17 @@ razdvojeni razmacima. \sectionbreak \section{Liste i pokazivači} -Za rad sa pokazivačima je potrebno iz modula \kod{Storage} uvesti procedure -\kod{ALLOCATE} i \kod{DEALLOCATE}. U kodu se tada mogu koristiti i njihovi -skraćeni oblici \kod{NEW} i \kod{DISPOSE}. +Za rad sa pokazivačima je potrebno iz modula \kod{Storage} uvesti +procedure za dinamičko zauzimanje i oslobađanje +memorije \kod{ALLOCATE} i \kod{DEALLOCATE}. + +U kodu se mogu koristiti i skraćeni oblici \kod{NEW} i \kod{DISPOSE} +koji se direktno prevode u prethodno pomenute procedure. + +\begin{codeblock} +ALLOCATE(point, SIZE(point)); (* isto kao NEW(point) *) +DEALLOCATE(point, SIZE(point)); (* isto kao DISPOSE(point) *) +\end{codeblock} \subsection{Zadatak: Formiranje, štampanje i brisanje listi}