Politechnika Świętokrzyska w Kielcach Wydział Elektrotechniki, Automatyki i Informatyki |
---|
Laboratorium Podstaw Programowania 2 |
Lab. nr 1 |
Data wykonania ćwiczenia : 01.03.2012 |
1.Przemysław Wolski |
Wstęp teoretyczny
Wskaźniki to adresy pamięci, które pokazują komputerowi miejsce gdzie znajdują się jakieś dane. Możesz przykładowo przechowywać w pamięci wskaźnik na obrazek bitmapowy, podczas gdy przechowywanie obrazu w tablicy byłoby niezbyt praktyczne. Pamięć do której odnoszą się wskaźniki można w każdej chwili zwalniać, deklarować i zmieniać.
Bez wskaźników nie byłoby możliwe nieograniczone tworzenie nowych danych, np. w słowniku. Gdyby nie wskaźniki mielibyśmy z góry określoną liczbę słów, które słownik byłby w stanie zapamiętać. W grach komputerowych, liczba ludzików, zbudowanych elementów w strategii, zawsze byłaby z góry ograniczona. Nie moglibyśmy w systemie uruchomić większej liczby programów niż zaplanowano.
Wskaźniki mogą wskazywać na dowolny obszar pamięci, a adres ten można zmieniać. Są pomocne podczas alokacji pamięci. Kiedy chcemy ją zadeklarować w czasie trwania programu, funkcja GetMem zwraca nam właśnie wskaźnik -czyli miejsce gdzie będziemy mogli wpisywać swoje dane. Gdybyśmy spróbowali wpisać swoje dane bez wcześniejszego zarezerwowania pamięci, w najlepszym wypadku zakończyłby się nasz program, w gorszym zawiesilibyśmy komputer.
Ze względu na ryzyko zawieszenia programu wskaźniki są traktowane jako typy, które należy umiejętnie stosować. Wskaźniki na ogół zbudowane są z 4 bajtów. Pierwsze 2 określają segment danych, kolejne 2 ofset.
Typ wskaźników nazywa się pointer. Gdy jakąś zmienną zadeklarujemy jako poiner, będzie ona wskaźnikiem. Wskaźniki mogą adresować różne typy zmiennych. Mogą adresować liczby, napisy, tablice, itd. Gdy adresują konkretny typ, nie deklaruje się ich jako pointer, tylko tworzy swój własny typ
Pomocne instrukcje.
• new
• dispose
• getmem
• freemem
• mark
• release
• adr
• @
• memavail
Przebieg Laboratium.
Zadanie 1:
Zadeklarować zmienną wskaźnikową w na typ integer i zainicjalizować ją adresem
zmiennej statycznej a = 123 i wyświetlić zawartość zmiennej a na ekran za pomocą zmiennej statycznej i wskaźnikowej. Czy wyniki będą takie same? (1 pkt)
Ilustracja 1. Zrzut ekranu przedstawiający kod programu nr 1.
Ilustracja 2. Zrzut ekranu przedstawiający wynik działania programu nr 1.
Czy wyniki będą takie same?
- tak, gdyż wskaźnik w wskazuje na zmienną a.
Zadanie 2:
Do zmiennej a z zadania 1 dodaj liczbę 2 i ponownie wyświetl zawartość zmiennej
a korzystając ze zmiennej statycznej i wskaźnikowej. Jaki jest wynik? (1 pkt)
Ilustracja 3. Zrzut ekranu przedstawiający kod programu nr 2.
Ilustracja 4. Zrzut ekranu przedstawiający wynik działania programu nr 2.
Jaki jest wynik?
- wartość zmiennej uległa zmianie a więc i zmieniła się wartość wskaźnika.
Zadanie 3:
Do zmiennej wskazywanej przez w z zadania 1 dodaj liczbę 3 i ponownie wyświetl
zawartość zmiennej a korzystając ze zmiennej statycznej i wskaźnikowej. Jaki jest wynik? (1 pkt)
Ilustracja 5. Zrzut ekranu przedstawiający kod programu nr 3.
Ilustracja 6. Zrzut ekranu przedstawiający wynik działania programu nr 3 .
Jaki jest wynik?
- wartość wskaźnika uległa zmianie a więc i zmieniła się też wartość zmiennej.
Zadanie 4:
Zadeklarować zmienne wskaźnikowe: w na word, oraz i na integer. Zainicjalizować
zmienną w wartością 45000. Zmiennej i przypisz zmienną w. Odczytaj wartości obydwu zmiennych. Jakie otrzymaliśmy wyniki? Dlaczego? (2 pkt)
Ilustracja 7. Zrzut ekranu przedstawiający kod programu nr 4.
Ilustracja 8. Zrzut ekranu przedstawiający wynik działania programu nr 4.
Jakie otrzymaliśmy wyniki? Dlaczego?
- zakres integer różni się od zakresu Word. Integer reprezentuje wartości będące w zakresie od -32768 do +32767 natomiast Word od 0 do 65535. Więc licznik się przekręca.
Zadanie 5:
• Zdefiniować typ rekordowy złożony z typów (word, int, char, string)
• Zadeklarować zmienną wskaźnikową na stworzony typ rekordowy
• Zarezerwować pamięć dla danego rekordu i wypełnić go przykładowymi danymi
• Wyświetlić dane z rekordu na ekran
• Zwolnić pamięć zarezerwowaną wcześniej
• Sprawdzić „wycieki pamięci” za pomocą funkcji memAvail (3 pkt)
Ilustracja 9. Zrzut ekranu przedstawiający 1 część kodu programu nr 5.
Ilustracja 10. Zrzut ekranu przedstawiający 2 część kodu programu nr 5.
Ilustracja 11. Zrzut ekranu przedstawiający 3 część kodu programu nr 5.
Ilustracja 12. Zrzut ekranu przedstawiający wynik działania programu nr 5.
Funkcja memAvail zwróciła takie same wartości a wiec nie było wycieku pamięci.
Wnioski
Bardzo ważną i pożyteczną cechą zmiennych wskazywanych jest możliwość ich tworzenia i niszczenia w zależności od potrzeb. Wymaga to co prawda użycia specjalnych procedur, pozwala jednak na znacznie bardziej efektywną gospodarkę pamięcią. W odróżnieniu od statycznych zmiennych globalnych, istniejących przez cały czas wykonywania programu, zmienne wskazywane należą do klasy zmiennych dynamicznych (czyli istnieją dokładnie wtedy, gdy życzy sobie tego programista).