• Kurs języka E - część 6

20.02.2005 13:40, autor artykułu: Wojciech Zatosrki (Amiga Computer Studio)
odsłon: 2035, powiększ obrazki, wersja do wydruku,

Zabawy z pamięcią

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.

CopyMemQuick(<pamiec_zrodlowa>,<pamiec_docelowa>,<dlugosc>)

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


 głosów: 1   
dodaj komentarz
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem