PODSTAWY PROGRAMOWANIA

Podobne dokumenty
Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

PODSTAWY PROGRAMOWANIA

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Wykład 8: klasy cz. 4

Podstawy Programowania C++

PODSTAWY PROGRAMOWANIA

Tworzenie własnych komponentów

Tablice. Jones Stygar na tropie zmiennych

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Wstęp do programowania. Różne różności

Podstawy programowania skrót z wykładów:

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Podstawy Programowania semestr drugi. Wykład czternasty

Zapis programu z wykorzystaniem modułu (Podstawy Delphi 2.1, 2.2, 2.3 str11 )

Język programowania. Andrzej Bobyk

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Język programowania PASCAL

Podstawy Programowania 2

Materiały do zajęć VII

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Wykład 4: Klasy i Metody

Wykład 5: Klasy cz. 3

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

PARADYGMATY PROGRAMOWANIA Wykład 4

Ada-95. Dariusz Wawrzyniak

Algorytmy i struktury danych. wykład 1

Lab 9 Podstawy Programowania

Wstęp do programowania 2

ZASADY PROGRAMOWANIA KOMPUTERÓW

Szablony klas, zastosowanie szablonów w programach

TEMAT : KLASY DZIEDZICZENIE

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Klasy abstrakcyjne i interfejsy

Rozdział 4 KLASY, OBIEKTY, METODY

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

C-struktury wykład. Dorota Pylak

Programowanie obiektowe

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Delphi Laboratorium 3

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Programowanie, część I

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wstęp do programowania 2

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie obiektowe

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Dziedziczenie jednobazowe, poliformizm

Wykład 1: Wskaźniki i zmienne dynamiczne

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Deklaracja struktury w C++

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

.NET Klasy, obiekty. ciąg dalszy

Pascal - wprowadzenie

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

Paweł Kurzawa, Delfina Kongo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Programowanie obiektowe

Język C++ zajęcia nr 2

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wykład 5 Okna MDI i SDI, dziedziczenie

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Wykład 3 Składnia języka C# (cz. 2)

Programowanie RAD Delphi

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Oracle PL/SQL. Paweł Rajba.

Definiowanie własnych klas

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Wykład 4. Tablice. Pliki

PODSTAWY PROGRAMOWANIA

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych.

Transkrypt:

PODSTAWY PROGRAMOWANIA Andrzej Marciniak Prezentacja multimedialna przygotowana za pomocą systemu Corel Presentations X3 Copyright 2003-2016 by Andrzej Marciniak PP-5(1 z 93)

Na poprzednim wykładzie... Ptypy danych i ich opis < definiowanie typów < typy proste (porządkowe, rzeczywiste) < typy łańcuchowe < typy strukturalne (tablicowe, rekordowe, zbiorowe, plikowe) PP-5(2 z 93)

Na tym wykładzie... Ptypy danych i ich opis (cd.) < typy opisujące obiekty < typy wskaźnikowe < typy proceduralne < typy wariantowe < zagnieżdżone definicje typów < zgodność typów PP-5(3 z 93)

Na tym wykładzie Pzmienne oraz literały stałe i zmienne < deklaracje zmiennych < zmienne ideksowane < zmienne rekordowe < zmienne obiektowe < zmienne dynamiczne < zmienne proceduralne < zmienne wariantowe < zmienne wątkowe < zmienne z początkową wartością < nakładanie zmiennych < literały stałe i zmienne PP-5(4 z 93)

Typy opisujące obiekty Podstawowymi typami, na których opiera się programowanie zorientowane obiektowo w języku Delphi, są typy klasowe. Każdy typ klasowy jest modelem struktury o stałej liczbie elementów i określa dane oraz czynności dla wszystkich obiektów, które zostaną na jego podstawie utworzone. Typ klasowy (lub krótko: klasa) definiuje zatem jak zbudować obiekt i jakie będą jego cechy. PP-5(5 z 93)

Typy opisujące obiekty Obiekt powstaje podczas wykonywania programu i żyje w jego aktywnej pamięci. Ponieważ po utworzeniu obiekt nie odwołuje się więcej do klasy, na podstawie której został zbudowany, więc jakiekolwiek zmiany poczynione na nim podczas wykonywania programu nie mają wpływu na inne obiekty, które powstały na podstawie tej samej klasy. PP-5(6 z 93)

Typy opisujące obiekty Zmienna typu klasowego nie zawiera obiektu jako takiego, ale jest wskaźnikiem do bloku pamięci, który został przydzielony dla obiektu. Wartość nil takiej zmiennej oznacza, że aktualnie nie jest ona odwołaniem do obiektu. Obiekty są tworzone i usuwane z pamięci za pomocą specjalnych procedur zwanych odpowiednio konstruktorami i destruktorami (będzie dalej). PP-5(7 z 93)

Typy opisujące obiekty Typy klasowe Klasa jest strukturą składającą się ze stałej liczby elementów, którymi mogą być: P pola (podobnie jak w rekordzie), P metody (m. in. procedury lub funkcje), P własności (łącza do danych, przechowywanych zwykle w polach, przy odczytywaniu i zapisywaniu których można wykonywać określone operacje). PP-5(8 z 93)

Typy opisujące obiekty Typy klasowe Definicja pojedynczego typu klasowego ma postać abstract type identyfikator-typu = class [(przodek)] sealed lista-elementów-klasy end; Przodek (element opcjonalny) oznacza identyfikator innego, zdefiniowanego wcześniej typu klasowego. Typem klasowym pierwotnym jest typ TObject predefiniowany w module System. PP-5(9 z 93)

Typy opisujące obiekty Typy klasowe Użycie dyrektywy języka sealed oznacza, że definiowana klasa nie może być rozszerzona poprzez dziedziczenie (nie może mieć potomków). Dyrektywa języka abstract oznacza klasę abstrakcyjną, czyli klasę będącą pewną podstawą (wzorem) dla klas potomnych. Dla klas abstrakcyjnych nie powinny być tworzone obiekty. PP-5(10 z 93)

Typy opisujące obiekty Typy klasowe Lista elementów klasy składa się z deklaracji pól, metod i własności. Deklaracje pól muszą przy tym poprzedzać deklaracje metod i własności. Każda z deklaracji pól ma postać lista-nazw-pól : opis-typu; lub var lista-nazw-pól : opis-typu; i spełnia tę samą rolę, co w definicji typu rekordowego, tzn. określa pola służące do przechowywania danych. PP-5(11 z 93)

Typy opisujące obiekty Typy klasowe W definicji typu klasowego mogą też występować tzw. pola klasowe, które także służą do przechowywania danych, ale w przeciwieństwie do zwykłych pól mogą być dostępne nie tylko po utworzeniu obiektu, ale także poprzez odwołanie do klasy. Deklaracje pól klasowych rozpoczynają się od słów kluczowych class var po których może występować dowolna liczba konstrukcji lista-nazw-pól : opis-typu; Kiedy takie deklaracje kończą się? PP-5(12 z 93)

Typy opisujące obiekty Typy klasowe Przykład Po definicji type moja_klasa = class class var pole1 : AnsiChar; var pole2 : Integer; end; do pola klasowego pole1 można odwołać się np. za pomocą instrukcji moja_klasa.pole1:= a ; a do pola pole2 dopiero po utworzeniu obiektu, czyli np. var mój_obiekt : moja_klasa;... wywołanie konstruktora mój_obiekt.pole2:=1; PP-5(13 z 93)

Typy opisujące obiekty Typy klasowe Postać każdej deklaracja metody jest następująca: nagłówek-metody; lub nagłówek-metody; dyrektywy-metody; gdzie nagłówek metody oznacza nagłówek funkcji, procedury, konstruktora lub destruktora (będzie dalej), a dyrektywy metody oznaczają rodzaj metody i konwencję wywołania (też będzie dalej). PP-5(14 z 93)

Typy opisujące obiekty Typy klasowe Deklaracje metod w typie klasowym są tylko zapowiedziami definicji metod, które występują po (niekoniecznie bezpośrednio) definicji typu klasowego w tej samej jednostce programowej (programie, module lub bibliotece łączonej dynamicznie), przy czym w przypadku definicji typu klasowego w części opisowej modułu definicje zadeklarowanych w typie klasowym metod występują w jego części implementacyjnej. PP-5(15 z 93)

Typy opisujące obiekty Typy klasowe Własności określają atrybuty obiektu danej klasy oraz operacje skojarzone z ich odczytem i zapisem. Każda deklaracja własności ma postać property nazwa-własności łącze-własności specyfikatory-własności; gdzie łącze własności służy m. in. do określenia typu własności, a specyfikatory własności sterują m. in. dostępem do wartości własności, tj. określają operacje skojarzone z odczytem lub zapisem. PP-5(16 z 93)

Typy opisujące obiekty Typy klasowe Każdy element lub grupa elementów występująca w liście elementów klasy może być poprzedzona specyfikatorem dostępności, który określa, gdzie dany element lub grupa elementów są dostępne. Istnieje siedem wzajemnie wykluczających się specyfikatorów dostępności: published, public, protected, strict protected, private, strict private i automated. Ich użycie wymaga podania samego słowa (słów), bez kończącego średnika. PP-5(17 z 93)

Typy opisujące obiekty Typy klasowe Dla elementów listy elementów klasy, które występują bezpośrednio po nagłówku definicji klasy, a które nie są poprzedzone żadnym z podanych słów, przyjmuje się, że ich specyfikatorem dostępności jest published, gdy dany typ klasowy został skompilowany w stanie {$M+} (inne oznaczenie: {$TYPEINFO ON}; domyślnie dyrektywa jest wyłączona) lub jest potomkiem typu skompilowanego w tym stanie oraz public w przeciwnym przypadku. PP-5(18 z 93)

Typy opisujące obiekty Typy klasowe Elementy, dla których obowiązuje specyfikator public, nie mają żadnych ograniczeń dostępności. Jedyna różnica dla sekcji published, w stosunku do sekcji public, polega na tym, że dla pól, własności i metod są generowane informacje o typach obowiązujących podczas wykonywania programu. Informacje te są wykorzystywane m. in. przez środowisko Delphi do wyświetlania własności w okienku Object Inspector oraz do dostępu do metod PP-5(19 z 93) obsługujących zdarzenia.

Typy opisujące obiekty Typy klasowe W definicji typu klasowego sekcje published mogą wystąpić tylko w przypadku, gdy typ został skompilowany w stanie {$M+} lub jest potomkiem typu skompilowanego w tym stanie. W bibliotece VCL w stanie {$M+} został skompilowany typ System.Classes.TPersistent. Ponieważ typy TComponent, TControl, TGraphicControl i TWinControl są jego potomkami, a z kolei komponenty widoczne i niewidoczne są zdefiniowane jako klasy potomne wymienionych typów, nietrudno zgadnąć, dlaczego podczas projektowania programu okienkowego własności komponentów są PP-5(20 z 93) wyświetlane w okienku Object Inspector.

Typy opisujące obiekty Typy klasowe Specyfikator automated pozostawiono w bieżącej wersji języka Delphi tylko dla zachowania zgodności z wersją 2.0 języka Object Pascal. W wersji tej specyfikator ten powodował generowanie informacji o tzw. typach automatyzacyjnych dla metod i własności, które umożliwiały tworzenie serwerów automatyzacji OLE. W programach tworzonych od podstaw od wersji 5 języka Delphi (Object) Pascal zaleca się wykorzystywać typ klasowy TAutoObject zdefiniowany w module System.Win.ComObj, który umożliwia tworzenie serwerów automatyzacji typu ActiveX i w którym nie używa się sekcji automated. PP-5(21 z 93)

Typy opisujące obiekty Typy klasowe Elementy wyszczególnione w sekcji protected są dostępne tylko w ramach danej klasy i klas z niej wyprowadzonych w bieżącym module. Użycie dodatkowo słowa strict, czyli specyfikatora strict protected, ogranicza dostępność elementów do klasy, w której zostały zadeklarowane i do klas potomnych (bez względu na to, gdzie te klasy zostały zdefiniowane). PP-5(22 z 93)

Typy opisujące obiekty Typy klasowe Elementy zdefiniowane w sekcji private są dostępne tylko w bieżącym module, ale nie tylko w ramach danej klasy i jej potomków. Zatem elementy te mają wszystkie cechy elementów, dla których obowiązuje specyfikator public, tyle że poza bieżącym modułem są one ukryte. Dodatkowe wyspecyfikowanie słowa strict, czyli użycie specyfikatora strict private, ogranicza dostępność takich elementów do klasy, w której zostały zadeklarowane. PP-5(23 z 93)

Typy opisujące obiekty Typy klasowe Definicje typów klasowych mogą zawierać samo słowo class i nic więcej, tzn. mieć postać type identyfiktor-typu = class; Konstrukcja taka jest zapowiedzią definicji typu klasowego i pozwala na definiowanie typów klasowych wzajemnie zależnych (w definicji jednego typu następuje odwołanie do drugiego i na odwrót). Właściwa definicja typu klasowego musi jednak wystąpić w tej samej części opisowej. PP-5(24 z 93)

Typy opisujące obiekty Typy klasowe Przykłady type klasa = class (TObject) pole1 : Integer; pole2 : array [1..20] of string; procedure metoda1 (parametr1 : Word; parametr2 : string); function metoda2 (parametr : Integer) : Boolean; end; PP-5(25 z 93)

Typy opisujące obiekty Typy klasowe Przykłady type nowa_klasa = class (klasa) pole : Boolean; constructor wpisz (wartosc_pola : Boolean); procedure metoda1 (parametr : Longint); function nowa_metoda (a : Word) : ShortString; virtual; end; Typ nowa_klasa jest potomkiem typu klasa z poprzedniego przykładu. PP-5(26 z 93)

Typy opisujące obiekty Typy klasowe Przykłady type następna_klasa = class (nowa_klasa) function nowa_metoda (a : Word) : ShortString; override; end; Metoda wirtualna nowa_metoda przesłania metodę wirtualną o takiej samej nazwie z typu nadrzędnego nowa_klasa, zdefiniowanego w poprzednim przykładzie. PP-5(27 z 93)

Typy opisujące obiekty Typy klasowe Przykłady type karta = class procedure ustal (wartość : Byte); function nazwa : string; private nominał : Byte end; Metody są ogólnie dostępne, ale pole nominał będzie dostępne tylko w bieżącym module. PP-5(28 z 93)

Typy opisujące obiekty Typy klasowe Przykłady Kolejność sekcji public i private jest dowolna, zatem równoważną definicją byłaby definicja postaci type karta = class private nominał : Byte; public procedure ustal (wartość : Byte); function nazwa : string; end; PP-5(29 z 93)

Typy opisujące obiekty Odwołania do klas W przypadku zwykłych typów klasowych operacje są wykonywane na obiektach, tj. zmiennych danych typów klasowych. Typy odwołań do klas umożliwiają wykonywanie pewnych operacji bezpośrednio na klasach i są niekiedy nazywane metaklasami. Definicja pojedynczego typu odwołania do klasy ma postać type identyfikator-typu = class of identyfikator-typu- klasowego; PP-5(30 z 93)

Typy opisujące obiekty Odwołania do klas Identyfikator podany po słowach class of jest traktowany jako wartość typu podanego w definicji. Zmienna typu odwołania do klasy może przyjąć tę wartość (odwołać się do niej) lub wartości określające dowolnego potomka danej klasy. Zmienna taka może również przyjąć wartość nil, co oznacza, że aktualnie nie odwołuje się ona do żadnej klasy. Typy odwołań do klas są użyteczne m. in. jako operandy operatorów is oraz as (będzie dalej). PP-5(31 z 93)

Typy opisujące obiekty Klasy pomocnicze Spełniają podobną rolę, co pomocnicze typy rekordowe S służą do modyfikowania kodu źródłowego bez ingerencji w oryginalne definicje klas. Definicja: type ident-typu = class helper (lista-przodków) for identyfikator-typu-oryginalnego lista-elementów-klasy-pomocniczej end; Metody zdefiniowane w klasie pomocniczej są nadrzędne PP-5(32 z 93) w stosunku do metod o takich samych nazwach.

Typy wskaźnikowe Zmienne dotychczas opisanych typów charakteryzują się tym, że istnieją przez cały czas wykonywania tej jednostki programowej, w której są zadeklarowane. Są to tzw. zmienne statyczne. Oprócz nich istnieją też zmienne dynamiczne, reprezentujące obiekty, dla których pamięć jest przydzielana i zwalniana na określone żądanie. Zmienne te nie mają identyfikatorów, a odwołanie do nich następuje za pomocą wskaźnika. Wartościami wskaźników są elementy typu wskaźnikowego, które określają adresy pamięci zmiennych dynamicznych. PP-5(33 z 93)

Typy wskaźnikowe Definicja pojedynczego typu wskaźnikowego ma postać type identyfikator-typu = ^identyfikator-typu-bazowego; gdzie identyfikator typu bazowego określa typ, którego dane będą wskazywane przez zmienne definiowanego typu wskaźnikowego. Identyfikator ten może, ale nie musi, być wcześniej określony. W drugim przypadku konieczne jest jego określenie w tej samej konstrukcji type, w której występuje definicja odnośnego typu wskaźnikowego. PP-5(34 z 93)

Typy wskaźnikowe Przykład type wskaźnik = ^zapis; zapis = record nagłówek : Char; tekst : string [50]; liczba : Integer end; Definicja ta wiąże typ wskaźnik ze zbiorem wskazań danych typu zapis. Jeśli wprowadzimy teraz deklarację var adres : wskaźnik; to zmiennej wskaźnikowej adres mogą być przypisywane adresy pamięci danych typu zapis. PP-5(35 z 93)

Typy wskaźnikowe nil - słowo kluczowe, które oznacza stałą typu wskaźnikowego nie określającą żadnego adresu (mówi się też, że słowo nil wskazuje na adres pusty). Pointer - predefiniowany typ wskaźnikowy. Zmienne typu Pointer nie wskazują danych żadnego typu, a odwołanie za ich pomocą przy użyciu symbolu ^ powoduje błąd (są one jednakże zgodne z dowolnym innym typem wskaźnikowym). Inne predefiniowane typy wskaźnikowe: PAnsiChar, PWideChar, PChar, PShortString, PAnsiString, PWideString, PString, PExtended, PCurrency, PInt64.PP-5(36 z 93)

Typy proceduralne Procedury i funkcje (będzie dalej) mogą być traktowane nie tylko jako części jednostki programowej wykonywane na skutek wywołania, ale także jako elementy, które mogą być przypisywane do zmiennych i przekazywane do innych funkcji i (lub) procedur jako parametry (z podobną sytuacją mamy do czynienia w przypadku metod). Zmienne tego rodzaju powinny być typów proceduralnych, wśród których wyróżniamy ogólne typy proceduralne i obiektowe typy proceduralne. PP-5(37 z 93)

Typy proceduralne Ogólne typy proceduralne Definicja pojedynczego typu może mieć jedną z następujących postaci: type identyfikator-typu = procedure; type identyfikator-typu = procedure (lista-parametrów); type identyfikator-typu = function : typ-wartości-funkcji; type identyfikator-typu = function (lista-parametrów) : typ-wartości-funkcji; PP-5(38 z 93)

Typy proceduralne Ogólne typy proceduralne Każda z podanych definicji może dodatkowo kończyć się jedną z dyrektyw języka register, pascal, cdecl, stdcall lub safecall, określającą tzw. konwencję wywołania (będzie dalej). Przykład type licz = function (x : Extended) : Extended; obliczenia = procedure (const x : Extended; f : licz; var y : Extended); PP-5(39 z 93)

Typy proceduralne Obiektowe typy proceduralne Są to typy określające metody. Definicja pojedynczego typu ma jedną z następujących postaci: type identyfikator-typu = procedure of object; type identyfikator-typu = procedure (lista-parametrów) of object; type identyfikator-typu = function : typ-wartości-funkcji of object; PP-5(40 z 93)

Typy proceduralne Obiektowe typy proceduralne Są to typy określające metody. Definicja pojedynczego typu ma jedną z następujących postaci: type identyfikator-typu = function (lista-parametrów) : typ-wartości-funkcji of object; Każda z tych definicji może być dodatkowo zakończona dyrektywą języka określającą konwencję wywołania. Elementy obiektowych typów proceduralnych są pamiętane jako dwa wskaźniki: pierwszy jest wskaźnikiem punktu wejścia do metody, a drugi określa obiekt, do którego dana PP-5(41 z 93) metoda należy.

Typy wariantowe Język Delphi zawiera predefiniowany typ Variant, którego elementy, zwane wariantami, mogą zmieniać typ podczas wykonywania programu. Warianty mogą być wartościami całkowitymi, rzeczywistymi, łańcuchowymi, logicznymi, typu TDateTime lub obiektami automatyzacji, a także tablicami o zmiennej liczbie wymiarów i rozmiarach oraz o elementach każdego z wymienionych typów. PP-5(42 z 93)

Typy wariantowe Każda zmienna typu Variant zajmuje 16 bajtów pamięci, a jej wewnętrzna reprezentacja jest rekordem typu TVarData, który zawiera określenie typu i wartość lub odwołanie (wskaźnik) do wartości. Definicja typu rekordowego TVarData (wraz ze związanym z nim typem wskaźnikowym) ma postać: PP-5(43 z 93)

Typy wariantowe type PVarData = ^TVarData; TVarData = packed record case Integer of Stałe o przedrostku var 0 : (VType : TVarType; (zdefiniowane w module case Integer of System) służą do 0 : (Reserved1 : Word; określenia typu wartości case Integer of wariantu. 0 : Reserved2, Reserved3 : Word; case Integer of varsmallint : (VSmallint : SmallInt); varinteger : (VInteger : Integer); varsingle : (VSingle : Single); vardouble : (VDouble : Double); varcurrency : (VCurrency : Currency);... varboolean : (VBoolean : WordBool);... varstring : (VString : Pointer);... vararray : (VArray : PVarArray);... end; PP-5(44 z 93)

Typy wariantowe Bezpośrednie używanie typu TVarData nie jest na ogół konieczne, gdyż do zadeklarowania zmiennych wariantowych służy predefiniowany identyfikator Variant. Typ TVarData może być użyty do zmiany typu zmiennej w odwołaniu do wariantu w celu dostępu do pól jego wewnętrznej reprezentacji. Na przykład za pomocą odwołania TVarData(zmienna-wariantowa).VType można sprawdzić aktualny typ danych zmiennej wariantowej, choć do tego celu wygod-niejsze jest zastosowanie funkcji standardowej VarType. PP-5(45 z 93)

Zagnieżdżone definicje typów Definicje typów mogą znajdować się wewnątrz definicji typów klasowych i typów rekordowych klasopodobnych. Typy takie nazywamy typami zagnieżdżonymi. Ich stosowanie ma na celu zgrupowanie razem (w jednym miejscu) typów powiązanych koncepcyjnie oraz zabezpiecza przed konfliktem nazw typów. Jeśli w definicji typu klasowego występuje zagnieżdżony typ klasowy, to przy dostępie do pól, metod i własności typu zagnieżdżonego należy stosować nazwy kwalifikowane uwzględniające typ zewnętrzny. PP-5(46 z 93)

Zgodność typów Poprawność określonej konstrukcji języka Delphi zależy na ogół od typu użytego w niej identyfikatora. W celu precyzyjnego opisu tej poprawności wprowadzono następujące pojęcia: Pidentyczności typów, Pzgodności typów, Pzgodności typów w sensie przypisania. PP-5(47 z 93)

Zgodność typów Identyczność typów Identyczność typów jest wymagana pomiędzy odpowiadającymi sobie parametrami formalnymi (przekazywanymi przez zmienną) i aktualnymi funkcji i procedur oraz metod. Mówimy, że dwa typy T1 i T2 są identyczne, gdy: Pmają ten sam identyfikator typu, Ptyp T1 jest zdefiniowany jako typ identyczny z T2, tzn. w definicji typu występuje konstrukcja T1=T2 lub konstrukcja, z której wynika, że T1=T2. PP-5(48 z 93)

Zgodność typów Identyczność typów Przykłady 1) type T1 = Integer; T2 = T1; T3 = T2; W wyniku powyższej definicji wszystkie typy T1, T2, T3 i Integer są identyczne. 2) type T4 = set of Byte; T5 = set of Byte; Na skutek tej definicji typy T4 i T5 nie będą identyczne, gdyż konstrukcja set of Byte nie oznacza identyfikatora PP-5(49 z 93) typu.

Zgodność typów Zgodność typów Zgodność typów wymagana jest niekiedy w wyrażeniach (będzie dalej). Dwa typy nazywamy zgodnymi, gdy spełniony jest przynajmniej jeden z następujących warunków:... (13 warunków) PP-5(50 z 93)

Zgodność typów Zgodność typów w sensie przypisania Zgodność typów w sensie przypisania wymagana jest przede wszystkim w instrukcji przypisania. Mówimy, że wartość w wyrażenia typu T2 jest zgodna w sensie przypisania ze zmienną x typu T1 (tzn. jest dopuszczalna instrukcja przypisania x:=w), jeżeli:... (19 warunków) PP-5(51 z 93)

Zmienne oraz literały stałe i zmienne Deklaracje zmiennych Zmienną nazywamy daną, która może przyjmować różne wartości w ramach typu przypisanego lub określonego dla tej zmiennej, a w przypadku, gdy typem zmiennej jest typ Variant wartości różnych typów. W języku Delphi wszystkie zmienne powinny być zadeklarowane, przy czym odpowiednie deklaracje powinny poprzedzać pierwsze wystąpienia zmiennych. PP-5(52 z 93)

Zmienne oraz literały stałe i zmienne Deklaracje zmiennych Deklaracje zmiennych mają postać var sekwencja-deklaracji przy czym każda deklaracja, występująca w sekwencji deklaracji, ma postać lista-identyfikatorów : oznaczenie-typu; gdzie oznaczenie typu jest opisem lub identyfikatorem typu, który określa typ zmiennej (zmiennych). Lista identyfikatorów składa się z jednego lub wielu (różnych) identyfikatorów zmiennych, przy czym w drugim przypadku poszczególne identyfikatory są oddzielone przecinkami. PP-5(53 z 93)

Zmienne oraz literały stałe i zmienne Deklaracje zmiennych Przykłady var i, j, k, l : Integer; a, b : Real; log : Boolean; tab : array [1..50] of Real; var p, q : A; st : stała typy A i stała powinny być określone w definicji typów PP-5(54 z 93)

Zmienne oraz literały stałe i zmienne Deklaracje zmiennych Zmienne zadeklarowane na zewnątrz procedur i funkcji oraz metod nazywamy zmiennymi globalnymi, a zmienne opisane wewnątrz procedur, funkcji i metod zmiennymi lokalnymi. Rozróżnienie to wynika ze sposobu przydziału pamięci. Wszystkie zmienne globalne umieszczone są w tzw. segmencie danych, dla którego pamięć przydzielana jest raz, w chwili rozpoczęcia wykonywania programu. Zmienne lokalne są umieszczane w tzw. segmencie stosowym (stosie), którego minimalny rozmiar wynosi 1024 bajty (standardowo 16 384 bajty), a maksymalny 2 147 483 647 bajtów. PP-5(55 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Do dowolnego elementu statycznej tablicy jednowymiarowej można odwołać się za pomocą nazwy indeksowanej. W najprostszym przypadku nazwa taka składa się z nazwy tablicy, tj. identyfikatora zmiennej typu tablicowego, po której następuje ujęty w nawiasy kwadratowe indeks. Indeks jest dowolnym wyrażeniem (będzie dalej), którego wartość powinna być zgodna w sensie przypisania z typem indeksowym podanym w definicji typu tablicowego. PP-5(56 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład Załóżmy, że jest dany następujący opis: type wektor = array [!5..10] of Extended; var a : wektor; który definiuje typ tablicowy wektor o 16 elementach typu Extended, ponumerowanych od!5 do 10, oraz deklaruje zmienną tablicową a typu wektor. Odwołanie do piątego elementu tablicy a, tj. odwołanie do elementu tej tablicy o indeksie!1, będzie miało postać a[!1]. Natomiast odwołanie a (bez indeksu) oznacza odwołanie do całej tablicy, tj. do wszystkich jej elementów. PP-5(57 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Do elementów statycznych tablic wielowymiarowych można odwoływać się w dwojaki sposób. Pierwszy z nich polega na wyspecyfikowaniu za nazwą tablicy ciągu indeksów, przy czym każdy z tych indeksów ujęty jest w nawiasy kwadratowe, a drugi uproszczony na podaniu odpowiednich indeksów oddzielonych przecinkami i ujęciu w nawiasy kwadratowe całego powstałego w ten sposób ciągu. PP-5(58 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Zmienne indeksowane służą także do odwoływania się do pojedynczych znaków zmiennych typów łańcuchowych krótkich i długich. W przypadku łańcucha krótkiego zmienna indeksowana może posiadać tylko jeden indeks o wartości od 0 do n, gdzie n oznacza zadeklarowaną lub przyjmowaną standardowo długość łańcucha. W przypadku łańcuchów długich i łańcuchów Unicode wartość indeksu powinna należeć do przedziału od 1 do m, gdzie m oznacza dynamiczną długość łańcucha, przy czym dla zmiennej typu WideString wyspecyfikowanie indeksu daje wartość typu WideChar. PP-5(59 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Zmienne indeksowane mogą być używane także do odwoływania się do elementów tablic dynamicznych. Deklaracja zmiennej typu tablicy dynamicznej powoduje przydzielenie jej tylko czterech bajtów pamięci zawierających wskaźnik do miejsca pamięci, począwszy od którego będą zapamiętane wartości elementów tablicy (w chwili deklaracji zmiennej bajtom tym przypisuje się wartość nil). Właściwe przydzielenie pamięci tablicy dynamicznej następuje przez wywołanie procedury standardowej SetLength lub DynArraySetLength i dopiero po tej operacji odpowiednia zmienna indeksowana określa elementy tablicy. PP-5(60 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład Zadeklarujmy zmienną: var tablica : array of Double; Deklaracja ta oznacza, że zmienna tablica będzie jednowymiarową tablicą dynamiczną o elementach typu Double. Deklaracja ta nie przydziela pamięci do zapamiętania tablicy, a jedynie cztery bajty do zapamiętania wskaźnika do tablicy i przypisanie im wartości nil. Jeśli zmienna tablica ma wskazywać na 20-elementową tablicę, to należy dla niej wywołać procedurę SetLength: SetLength (tablica, 20); Wywołanie to powoduje przydzielenie pamięci na wartości elementów tablicy tablica (łącznie 160 bajtów, gdyż każda wartość typu Double zajmuje 8 bajtów pamięci), której elementy będą indeksowane od 0 do 19 (elementy tablic dynamicznych są zawsze indeksowane od 0). Na przykład dostęp do pierwszego elementu tej tablicy uzyskamy za pomocą zmiennej indeksowanej tablica[0], do dziesiątego za pomocą zmiennej tablica[9], a odwołanie do ostatniego elementu tablicy będzie PP-5(61 z 93) miało postać tablica[19].

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Ponieważ wartościami zmiennych będących tablicami dynamicznymi są wskaźniki miejsc pamięci, w przeciwieństwie do tablic statycznych tablice dynamiczne nie są automatycznie kopiowane w wyniku instrukcji przypisującej jedną tablicę drugiej. PP-5(62 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład Rozważmy następujące deklaracje tablic statycznych i dynamicznych: var ts1, ts2 : array [0..0] of Integer; td1, td2 : array of Integer; W wyniku wykonania instrukcji: ts1[0]:=10; ts2:=ts1; ts2[0]:=20; wartością zmiennej indeksowanej ts2[0] będzie 20, a zmiennej ts1[0] liczba 10 PP-5(63 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład Jeśli jednak wykonamy instrukcje: SetLength (td1, 1); td1[0]:=10; td2:=td1; td2[0]:=20; to wartością zmiennej td1[0] będzie 20. Instrukcja przypisania td2:=td1; powoduje bowiem przydzielenie tablicy dynamicznej td2 tego samego obszaru pamięci, co tablicy td1 (wszelkie zmiany wartości elementów tablicy td2 będą więc równoważne zmianom wartości elementów tablicy td1 o tych samych indeksach). PP-5(64 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane W przeciwieństwie do tablic statycznych, wielowymiarowe tablice dynamiczne nie muszą być prostokątne. Po zadeklarowaniu zmiennej będącej taką tablicą, za pomocą procedury SetLength można określić tylko zakres indeksów kilku początkowych wymiarów, a następnie, poprzez ponowne wywołania tej procedury dla poszczególnych wymiarów, zdefiniować różne zakresy indeksów w ramach PP-5(65 z 93) poszczególnych wymiarów.

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład Metoda eliminacji Gaussa służąca do rozwiązywania układów równań liniowych postaci Ax = b, gdzie A oznacza macierz kwadratową stopnia n, polega na wykonaniu n! 1 przekształceń (eliminacji), które dany układ równań doprowadzają do równoważnego mu (o takim samym rozwiązaniu) układu równań Rx = c, w którym macierz R jest macierzą trójkątną górną stopnia n. Elementy macierzy trójkątnej górnej R można przechować w dwuwymiarowej, trójkątnej tablicy dynamicznej, której utworzenie dla n = 20 zapewni deklaracja var R : array of array of Extended; PP-5(66 z 93)

Zmienne oraz literały stałe i zmienne Zmienne indeksowane Przykład oraz następujące instrukcje: SetLength (R, 20); for i:=low(r) to High(R) do SetLength (R[i], 20!i); gdzie i oznacza zmienną typu Integer. Utworzona w ten sposób tablica dynamiczna R zajmie 210 10 bajtów pamięci. Gdybyśmy tablicę R utworzyli w sposób statycz-ny, na przykład za pomocą deklaracji var R : array [0..19, 0..19] of Extended; to zajęłaby ona 20 2 10 bajtów pamięci (prawie dwa razy więcej). Ostatnia deklaracja przydziela bowiem pamięć dla tablicy PP-5(67 z 93) prostokątnej o 20 wierszach i 20 kolumnach.

Zmienne oraz literały stałe i zmienne Zmienne rekordowe, obiektowe i desygnatory Zmienną, której wartości są typu rekordowego nazywamy zmienną rekordową. W celu odwołania się do elementu podstawowego rekordu (pola) należy za identyfikatorem zmiennej rekordowej podać także tzw. desygnator pola postaci.identyfikator-pola Odwołanie do pola rekordu ma zatem postać zmienna-rekordowa.identyfikator-pola PP-5(68 z 93)

Zmienne oraz literały stałe i zmienne Zmienne rekordowe, obiektowe i desygnatory Zmienną, której wartości są typu klasowego, nazywamy zmienną obiektową. W celu odwołania się do pola obiektu stosuje się, podobnie jak dla rekordu, desygnator pola. W odowołaniu do własności stosujemy desygnator własności:.identyfikator-własności PP-5(69 z 93)

Zmienne oraz literały stałe i zmienne Zmienne rekordowe, obiektowe i desygnatory W odowołaniu do metody stosujemy desygnator metody postaci.nazwa-metody lub.nazwa-metody (lista-parametrów-aktualnych) PP-5(70 z 93)

Zmienne oraz literały stałe i zmienne Zmienne rekordowe, obiektowe i desygnatory Odwołanie do pola obiektu ma zatem postać zmienna-obiektowa.identyfikator-pola do własności jest postaci zmienna-obiektowa.identyfikator-własności a do metody zmienna-obiektowa.nazwa-metody lub zmienna-obiektowa.nazwa-metody (lista-parametrów- -aktualnych) Odwołania do pól rekordów i obiektów można znacznie uprościć, stosując instrukcję wiążącą (będzie dalej). PP-5(71 z 93)

Zmienne oraz literały stałe i zmienne Zmienne dynamiczne Wartości typów wskaźnikowych, tj. wskaźniki, określają adresy pamięci zmiennych dynamicznych, którym pamięć może być przydzielana i zwalniana w trakcie wykonywania programu. W celu odwołania się do zmiennej pewnego typu, z którym związano typ wskaźnikowy, stosuje się zmienne wskazywane postaci zmienna-wskaźnikowa^ Jeżeli zmienną wskaźnikową oznaczymy przez w i założymy, że jest ona związana z typem T, to zmienną wskazywaną w^ jest ta zmienna typu T, na którą wskazuje w. Wartością PP-5(72 z 93) zmiennej w^ jest więc pewien element typu T o adresie w.

Zmienne oraz literały stałe i zmienne Zmienne dynamiczne Przykład type wskaźnik = ^zapis; zapis = record nagłówek : Char; tekst : string [50]; liczba : Integer end; var w : wskaźnik; W opisie tym zdefiniowano dwa typy: wskaźnikowy wskaźnik i rekordowy zapis. Wartościami zmiennej wskaźnikowej w typu wskaźnik (typ ten jest związany z typem rekordowym zapis) będą odpowiednie adresy, natomiast zmienna wskazywana w^ będzie rekordem typu zapis o adresie określonym przez w. PP-5(73 z 93)

Zmienne oraz literały stałe i zmienne Zmienne dynamiczne Do przydzielania pamięci zmiennym dynamicznym (do utworzenia zmiennej dynamicznej i ustalenia zmiennej wskaźnikowej wskazującej na nią) służą procedury New i GetMem (będzie dalej). Do zwolnienia obszaru pamięci dynamicznej i tym samym eliminacji odpowiedniej zmiennej dynamicznej służą procedury Dispose i FreeMem (też będzie dalej). PP-5(74 z 93)

Zmienne oraz literały stałe i zmienne Zmienne proceduralne Deklaracja pojedynczej zmiennej proceduralnej jest następująca: var identyfikator-zmiennej : typ-proceduralny; gdzie typ proceduralny oznacza albo nazwę ogólnego lub obiektowego typu proceduralnego, albo ich opis. PP-5(75 z 93)

Zmienne oraz literały stałe i zmienne Zmienne proceduralne Zmiennej proceduralnej mogą być przypisywane wartości proceduralne, tzn.: P identyfikatory funkcji i procedur, gdy zmienna jest ogólnego typu proceduralnego (ale nie funkcje i procedury z modułu System oraz zagłębione, tj. opisane wewnątrz innej funkcji lub procedury), P identyfikatory metod (z kwalifikacją obejmującą nazwę zmiennej obiektowej), gdy zmienna jest obiektowego typu proceduralnego, P wartości innych zmiennych proceduralnych, P adres pusty (nil). PP-5(76 z 93)

Zmienne oraz literały stałe i zmienne Zmienne proceduralne Przykłady Jeśli zadeklarujemy zmienną proceduralną parsin następująco: var parsin : function (a : Extended) : Extended; to przypisanie parsin:=sin; nie będzie możliwe, gdyż Sin oznacza funkcję standardową modułu System. Jeśli jednak zdefiniujemy funkcję: function sinus (x : Extended) : Extended; begin sinus:=sin(x) end; to przypisanie parsin:=sinus; będzie poprawne. PP-5(77 z 93)

Zmienne oraz literały stałe i zmienne Zmienne wariantowe Zmienne wariantowe mogą być zadeklarowane za pomocą predefiniowanego identyfiktora Variant. Podczas wykonywania programu zmiennym tego typu można przypisywać wartości różnych typów. Dozwolona jest także operacja odwrotna, tj. przypisywanie wartości zmiennych wariantowych zmiennym różnych typów. PP-5(78 z 93)

Zmienne oraz literały stałe i zmienne Zmienne wariantowe Przykład Załóżmy, że w programie zadeklarowano następujące zmienne: var w1, w2, w3 : Variant; i : Integer; d : Double; łańcuch : AnsiString; Zmiennym wariantowym w1, w2 i w3 można przypisać wartości różnych typów, np. w1:=5; przypisanie wartości całkowitej w2:=12.345678; przypisanie wartości rzeczywistej w3:= Delphi XE2 ; przypisanie łańcucha Możliwość przypisania wartości zmiennych wariantowych zmiennym różnych typów oznacza, że możliwe są przypisania i:=w1; d:=w2; łańcuch:=w3; PP-5(79 z 93)

Zmienne oraz literały stałe i zmienne Zmienne wariantowe Zmienne wariantowe mogą zawierać tablice o zmiennym rozmiarze, zmiennej liczbie wymiarów i elementach będących wartościami dowolnego z podstawowych typów wariantowych (określonych stałymi rozpoczynającymi się od przedrostka var). Wszystkie elementy tablicy są tego samego typu, ale jeśli typem elementów jest Variant, to poszczególne elementy tablicy mogą zawierać dane różnych typów (włączając w to kolejne tablice wariantowe). Tablice wariantowe tworzy się zwykle za pomocą funkcji standardowej VarArrayCreate. PP-5(80 z 93)

Zmienne oraz literały stałe i zmienne Zmienne wariantowe Przykłady Deklaracja zmiennej wariantowej a postaci var a : Variant; nie określa jeszcze tej zmiennej jako tablicy wariantowej. Zmienna a będzie taką tablicą po jej utworzeniu, tj. po wykonaniu instrukcji a:=vararraycreate([0, 4], varinteger); gdzie VarArrayCreate oznacza funkcję standardową, której pierwszy argument wywołania, ujęty w nawiasy kwadratowe, określa zakres indeksów tablicy, a drugi (varinteger) typ elementów tablicy. Po utworzeniu tablicy wariantowej możliwe są przypisania wartości jej elementom, na przykład a[0]:=2; a[4]:=4; PP-5(81 z 93)

Zmienne oraz literały stałe i zmienne Zmienne wariantowe Przykłady W celu utworzenia dwuwymiarowej tablicy wariantowej należałoby zastosować instrukcję postaci a:=vararraycreate ([0, 3, 1, 5], vardouble); W wywołaniu funkcji VarArrayCreate pierwszy parametr (ujęty w nawiasy kwadratowe) definiuje zakres indeksów pierwszego wymiaru tablicy (od 0 do 3) oraz drugiego (od 1 do 5). W celu przypisania elementowi tej tablicy o indeksach 0 i 2 wartości 1,2345 należałoby zastosować instrukcję a[0,2]:=1.2345; Ewentualne odwołanie a[0,0] spowodowałoby wystąpienie warunku błędu EVariantError, gdyż drugi indeks nie należy do PP-5(82 z 93) dozwolonego zakresu indeksów drugiego wymiaru tablicy.

Zmienne oraz literały stałe i zmienne Zmienne wątkowe Wykonywanie programu, który ma swój kod i dane, zajmuje własną, wirtualną przestrzeń adresową oraz korzysta z zasobów systemowych, nazywa się procesem. Na proces może składać się jeden lub kilka wątków. Wątek jest podstawową jednostką, której system operacyjny przydziela czas procesora. Jest on niezależną ścieżką wykonywania części kodu programu wewnątrz procesu. Wszystkie wątki programu wykorzystują tę samą wirtualną przestrzeń adresową, zmienne globalne i zasoby systemowe procesu. Oprócz tego każdy wątek posiada swoje własne rejestry, własny stos i własny mechanizm wejścia, w tym PP-5(83 z 93) kolejkę wiadomości.

Zmienne oraz literały stałe i zmienne Zmienne wątkowe Z obsługą wątków są związane zmienne wątkowe, które deklaruje się następująco: threadvar sekwencja-deklaracji gdzie sekwencja deklaracji ma taką samą postać, jak w przypadku zwykłej deklaracji zmiennych. Deklaracja jakiejś zmiennej jako wątkowej oznacza, że jest ona zmienną lokalną w ramach wątku. Do obsługi wątków zaprojektowano w języku Delphi klasę TThread zdefiniowaną w module System.Classes (zob. system pomocy). PP-5(84 z 93)

Zmienne oraz literały stałe i zmienne Zmienne z początkową wartością W deklaracji zmiennej można nadać jej pewną początkową wartość, która następnie może być zmieniana. Do zadeklarowania zmiennej z początkową wartością służy konstrukcja var identyfikator-zmiennej : oznaczenie-typu = stała- typowa; gdzie oznaczenie typu jest identyfikatorem typu lub jego opisem, a stała typowa oznacza m. in. wyrażenie stałe. PP-5(85 z 93)

Zmienne oraz literały stałe i zmienne Zmienne z początkową wartością Zmienne, którym nadano początkową wartość, mogą być wyłącznie zmiennymi globalnymi. Oznacza to, że podana konstrukcja nie może wystąpić w definicjach funkcji i procedur oraz metod. Nie jest dozwolone przypisywanie początkowych wartości zmiennym plikowym i wariantowym. Przykład var x : Real = 1.23; Konstrukcja ta deklaruje zmienną x typu Real i jednocześnie nadaje jej wartość 1,23. PP-5(86 z 93)

Zmienne oraz literały stałe i zmienne Nakładanie zmiennych Każdej zmiennej można przydzielić pamięć o takim samym adresie, jaki posiada inna zmienna, zadeklarowana wcześniej. Oznacza to w praktyce, że obie zmienne rezydują w tym samym obszarze pamięci, tj. są na siebie nałożone. Odpowiednia deklaracja ma postać var identyfikator-zmiennej-1 : oznaczenie-typu absolute identyfikator-zmiennej-2; gdzie identyfikator podany po słowie absolute oznacza zmienną zadeklarowaną wcześniej. Powyższa deklaracja powoduje przydzielenie pamięci nowej zmiennej począwszy od miejsca, w którym rozpoczyna się pierwsza zmienna. PP-5(87 z 93)

Zmienne oraz literały stałe i zmienne Zmiana typu zmiennej w odwołaniu Odwołanie do zmiennej określonego typu może być zmienione na odwołanie do tej samej zmiennej, ale innego typu. Służy do tego konstrukcja postaci identyfikator-typu (odwołanie-do-zmiennej) Po zastosowaniu podanej konstrukcji zmienna taka będzie traktowana jak zmienna typu określonego przez wyspecyfikowany identyfikator typu. Rozmiar zmiennej, tj. liczba zajmowanych przez nią bajtów pamięci, musi być przy tym zgodny z rozmiarem typu o podanym identyfikatorze. Nie wszystkie zamiany typu zmiennej są dozwolone! PP-5(88 z 93)

Zmienne oraz literały stałe i zmienne Literały Stałe mogą być zastąpione przez przypisane im identyfikatory. Przypisanie identyfikatorów do stałych (wyrażeń stałych) następuje za pomocą konstrukcji const sekwencja-definicji-nazw-literałów gdzie każda definicja nazwy literału ma postać identyfikator = wyrażenie-stałe; lub identyfikator : oznaczenie-typu = stała-typowa; PP-5(89 z 93)

Zmienne oraz literały stałe i zmienne Literały Druga postać definicji nazwy literału określa tzw. literał zmienny. O tym, czy tak zdefiniowanemu identyfikatorowi można dalej (w części wykonawczej) zmienić wartość, czy nie, decyduje stan dyrektywy kompilatora $J. W domyślnym stanie {$J+} zmiana wartości przypisanej literałowi zmiennemu w jego definicji jest dozwolona. Spełnia on wówczas tę samą rolę, co zmienna z początkową wartością. Jeśli jednak dyrektywa kompilatora $J jest wyłączona (stan {$J!}), to literał zmienny jest przeznaczony tylko do odczytu. PP-5(90 z 93)

Zmienne oraz literały stałe i zmienne Literały Przygotować samodzielnie przypisywanie początkowych wartości literałom różnych typów. PP-5(91 z 93)

Zmienne oraz literały stałe i zmienne Zagnieżdżone definicje literałów Definicje literałów mogą występować w obrębie definicji klas i typów rekordowych (podobnie jak definicje typów). Literały takie nazywamy literałami zagnieżdżonymi. Definicja literałów zagnieżdżonych rozpoczyna się słowem kluczowym const i kończy wystąpieniem jednostki leksykalnej, która nie jest identyfikatorem, np. słów kluczowych var, procedure, a w przypadku klas także specyfikatora dostępności. PP-5(92 z 93)

161 stron pewnej książki mamy już za sobą!!! PP-5(93 z 93)