WSKAZNIKI I ALOKACJA PAMIECI

1. Ograniczenia statycznie deklarowanych zmiennych, potrzeba dynamicznej
   alokacji pamieci.
2. Odwolanie do dynamicznie tworzonych zmiennych - wskazniki.
3. Niebezpieczenstwa i uwagi:
  a) przypisania - uwaga na przypisywanie wskaznikow (gubienie dowiazan,
     bledy przy usuwaniu);
  b) przekazywanie do procedur, funkcji - wartosc wskaznika wystarcza
     do modyfikacji wartosci zmiennej, ale zeby modyfikowac wskaznik
     trzeba go przekazywac przez zmienna (VAR);
  c) zwalnianie - podwojn usuwanie, uzywanie zwolnionych zmiennych;
4. Dynamiczne zmienne w tablicach:
  a) tablica wskaznikow, rozwiazanie "ladne", dobre dla duzych zmiennych
     (rekordy, napisy stalej wielkosci);
     VAR t : ARRAY[1..1000] OF ^Typ;
     ...
     New(t[i]);
     t[i]^ := cos;
  b) tablica dynamicznej wielkosci i wskaznik do niej,
     rozwiazanie "brzydkie", system nie wykryje przekroczenia zakresu,
     ale efektywne dla duzych tablic malych zmiennych, oraz dla napisow
     roznej wielkosci;
     TYPE Tab = ARRAY[1..10000] OF Typ;
     VAR t : ^Tab;
     ...
     Getmem(t, 400 * SizeOf(Typ));
     ...
     t^[i] := cos; { 1 <= i <= 400 }

     zamiast ARRAY[] OF Typ moze byc tez STRING

5. ZADANIE
  Napisz program, ktory z pliku tekstowego o nazwie podanej w parametrze
  wczytuje kolejne wiersze, a pozniej wypisuje je do drugiego pliku w
  odwroconej kolejnosci (ale kazdy wiersz bez zmian).
  Mozesz zalozyc, ze kazdy wiersz ma dlugosc do 255 znakow.
  Wiersze zapamietuj w tablicy wskaznikow, jak w (4.a), a kazdy napis
  niech bedzie alokowany funkcja GetMem zajmujac tylko tyle pamieci, ile
  jest konieczne.
  Pamietaj o poprawnym zwolnieniu pamieci na koniec.
  Podaj wielkosci MemAvail i MaxAvail na poczatku, po wczytaniu
  wszystkich wierszy i na koncu programu. Czy pamiec nie wycieka ?