Nieraz przychodzi ten czas, że chcemy np. wczytać cały plik do pamięci, a
nie odczytywać po bajcie. Taką sytuacją może być np. chęć wyświetlenia
rysunku czy "puszczenia" modułu (mp3?).
W E mamy wiele funkcji do rezerwacji pamięci, wbudowanymi funkcjami są:
<pamiec>:=New(<dlugosc>)
Rezerwuje pamięć o rozmiarze <dlugosc>, jeśli nie może zarezerwować
pamięci zwraca NIL (czyli zero), pamięć jest czyszczona zerami. Wybierana
jest pamięć ta, która jest aktualnie dostępna (tak więc może to być FAST jak
i CHIP). Pamięć po zakończeniu programu jest automatycznie zwracana.
<pamiec>:=NewR(<dlugosc>)
Zasada jest ta sama co z New(), jedyną różnicą jest to że wyjątek "MEM" jest
wywoływany. O tym mówić będę w następnych częściach kursu, na razie dla nas
polecenie NewR jest bezużyteczne.
<pamiec>:=NewM(<dlugosc>,<typ>)
Zasada ta sama co przy New() z tą różnicą, że możemy wybrać jaka pamięć ma
być zarezerowawana, czy FAST czy CHIP.
<typ>:= MEMF_CHIP -> Pamięć CHIP ma być użyta
<typ>:= MEMF_FAST -> Pamięć FAST ma być użyta
Istnieją również inne typy, które na razie pominiemy.
Jeśli chcemy zwolnić pamięć wcześniej zarezerwowaną przez któryś z New'ów
możemy do tego użyć polecenia:
Dispose(<pamiec>)
Gdzie <pamiec> to adres zwracany przez polecenie New() (NewR() lub
NewM())
Istnieje również polecenie do szybkiej rezerwacji pamięci (przyznam się, że
w ogóle tego polecenia nie używam):
pamiec:=FastNew(<dlugosc>)
Zasada działania jest taka sama jak przy NewR() tyle, że niby szybciej.
Pamięć oczywiście po zakończeniu programu jest automatycznie zwracana.
Jeśli chcemy wcześniej zwolnić pamięć to wtedy musimy do tego wykorzystać
polecenie:
FastDispose(<pamiec>,<dlugosc>)
Gdzie <pamiec> to adres zwracany przez FastNew(),a <dlugosc>
to rozmiar podawany przy FastNew().
Oprócz tych funkcji wbudowanych w kompilator istnieją również systemowe,
dostępne w bibliotece "exec.library", która jest zawsze dostępna. Więc nie
musimy się martwić w otwieranie/zamykanie tej biblioteki.
<pamiec>:=AllocMem(<dlugosc>,<typ>)
Działa na tej samej zasadzie jak NewM() z tą różnicą, że pamięć nie jest
zwracana. Tak więc o zwrot pamięci do systemu musimy się sami martwić
używając polecenia:
FreeMem(<pamiec>,<dlugosc>)
gdzie podajemy <pamiec> (adres zwracany przez AllocMem()) oraz
<dlugosc> (rozmiar pamięci jaką podaliśmy przy AllocMem())
<pamiec>:=AllocVec(<dlugosc>,<typ>)
Działa na tej samej zasadzie co AllocMem() z tą różnicą, że zapamiętuje
rozmiar pamięci zarezerowowanej, więc przy FreeVec() nie trzeba już podawać
długości zarezerwowanej pamięci.
FreeVec(<pamiec>)
Zwalnia zarezerwowaną pamięć przez AllocVec().
A może skopiujemy z jednego miejsca do drugiego miejsca kawałek pamięci?
Dzięki poleceniu:
CopyMem(<pamiec_zrodlowa>,<pamiec_docelowa>,<dlugosc>)
możemy kopiować pamięć dowoli z adresu <pamiec_zrodlowa> do adresu <pamiec_docelowa> o rozmiarze <dlugosc>.
Istnieje również szybsza procedura kopiowania, która rózni się od zwykłego CopyMem tym, że <dlugosc> musi dać się podzielić przez 4 nie dając przy tym wartości ułamkowej (typu 34.5 lub 0.5) oraz <pamiec_zrodlowa> i <pamiec_docelowa> musi być typu LONG.
Dziś poznaliśmy |
New(dlugosc) - zarezerwuj pamięć o dlugosc'i NewR(dlugosc) - zarezerwuj "czystą" pamięć o dlugosc'i NewM(dlugosc,typ) - zarezerwuj pamięć o dlugosc'i typie Dispose(pamiec) - zwolnij pamięć FastNew(dlugosc) - zarezerwuj szybko pamięć o dlugosc'i FastDispose(pamiec,dlugosc) - zwolnij szybko zarezerwowaną pamięć o dlugosc'i AllocMem(dlugosc,typ) - zarezerwuj pamięć o dlugosc'i i typie FreeMem(pamiec,dlugosc) - zwolnij pamięć zarezerwowaną przez AllocMem() AllocVec(dlugosc,typ) - zarezerwuj pamięć o dlugosc'i i typie oraz pamiętaj o rozmiarze FreeVec(pamiec) - zwolnij pamięć zarezerwowaną przez AllocVec() CopyMem(zrodlo,cel,dlugosc) - kopiuj pamięć z jednego obszaru do drugiego CopyMemQuick(zrodlo,cel,dlugosc) - kopiuj szybko pamięć z jednego do drugiego obszaru |