Laboratorium informatyki II. Język Pascal. Semestr letni.
Ćwiczenie 7.
Wskaźniki i zmienne dynamiczne
Cel ćwiczenia: definiowanie zmiennych wskaźnikowych; dostęp do zmiennych za pomocą wskaźników; inicjowanie wskaźników adresami zmiennych statycznych; wskaźniki typu pointer; rzutowanie wskaźników (konwersja typu); wyznaczanie adresu fizycznego zmiennej;
wyprowadzanie segmentu i offsetu wskaźników; tworzenie wskaźnika na zadany adres pamięci; tworzenie zmiennych dynamicznych na stercie i przypisywanie ich adresów wskaźnikom (procedury new, dispose, getmem, freemem).
1. Zdefiniować wskaźnik na zmienną typu integer. Zainicjować wskaźnik adresem zmiennej statycznej a = 5 typu integer. Wyprowadzić na ekran zawartość zmiennej za pomocą wskaźnika oraz za pomocą identyfikatora zmiennej (wartości powinny być identyczne).
2. Zdefiniować wskaźnik typu pointer. Zainicjować wskaźnik adresem zmiennej x = 2.5 typu real. Wyprowadzić na ekran wartość wskaźnika (segment i offset) oraz zawartość obszaru wskazywanego.
3. Zdefiniować zmienną b = 20 typu integer. Zdefiniować wskaźnik typu pointer i zainicjować go adresem zmiennej b. Przypisać wartość wskaźnika typu pointer do wskaźnika typu
integer. Wyprowadzić zawartość pamięci wskazywanej przez każdy ze wskaźników.
4. Opracować funkcję, która wyznacza adres wskazywany przez wskaźnik typu pointer (wykorzystać funkcje OFS i SEG). Adres fizyczny jest obliczany ze wzoru:
adres = seglongint(16) + ofs. Nagłówek funkcji: longint adres(p: pointer).
5. Zdefiniować stałe (const) typu char, integer, longint, real oraz wskaźniki na stałe.
Zainicjować wskaźniki adresami stałych. Wyprowadzić adresy fizyczne stałych oraz ich zawartości.
6. Zdefiniować wskaźnik p typu pointer. Zainicjować wskaźnik (np. za pomocą Ptr lub za pomocą bezpośredniego podstawienia wartości) adresem początku pamięci ekranu
w trybie znakowym (adres $B8000 - wskaźnik $B800:$0000). Wyprowadzić na ekran wybrany znak wykorzystując zdefiniowany wskaźnik.
7. Zdefiniować wskaźniki na zmienne typu char, integer, longint, real. Za pomocą procedury new utworzyć zmienne dynamiczne typu char, integer, longint, real i zapamiętać ich adresy w odpowiednich wskaźnikach. Wczytać z klawiatury dane do utworzonych zmiennych dynamicznych. Wyprowadzić za pomocą wskaźników zawartości zmiennych.
Wykorzystując procedurę dispose zwolnić pamięć przydzieloną zmiennym. Wyprowadzić stan
pamięci na początku i na końcu programu (memavail).
8. Opracować procedurę wczytującą do bufora o rozmiarze K bajtów, utworzonego na stercie za pomocą procedury getmem, D pierwszych bajtów określonego pliku (D <=K).
Wyświetlić zawartość bufora na ekranie w postaci znakowej (znaki nie dające się
wyświetlić zastąpić kropkami). Przed zakończeniem programu zwolnić pamięć za pomocą freemem. Wyprowadzić stan pamięci na początku i na końcu programu (memavail).