gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
pojasnjenja o procedurama za rad sa dinamickom memorijom
[spa1skripta-public.git] / skripta-spa1-sadrzaj.tex
index 50655d0..a4b637e 100644 (file)
@@ -532,10 +532,19 @@ najadekvatniju za konkretnu primenu. U opštem slučaju definišemo npr:
      String = ARRAY [1..30] OF CHAR;
 \end{codeblock}
 
      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
 
 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
     
 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
 
 \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}
 
   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.
 
 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.
 
 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}
 
 
 \subsection{Zadatak: ispis sadržaja fajla na ekran}
 
@@ -663,9 +702,17 @@ razdvojeni razmacima.
 \sectionbreak
 \section{Liste i pokazivači}
 
 \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}
 
 
 \subsection{Zadatak: Formiranje, štampanje i brisanje listi}
 
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner