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 ?