DEL420 Zaawansowane programowanie w (pakiecie) Delphi Andrzej Marciniak Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel Presentations 11 i X3 Copyright 2004-2010 by Andrzej Marciniak DEL-3(1 z 65)
Na poprzednim wyk³adzie... obs³uga warunków i stanów wyj¹tkowych instrukcja wywo³ywania stanów wyj¹tkowych (raise) instrukcja try... except instrukcja try... finally predefiniowane warunki i stany wyj¹tkowe okienka z komunikatami DEL-3(2 z 65)
Na tym wyk³adzie... programowanie bibliotek ³¹czonych dynamicznie dostêp do funkcji i procedur modu³y importowe importowanie statyczne i dynamiczne tworzenie bibliotek DLL b³êdy wykonania w bibliotekach DLL funkcje i procedury rodzaje parametrów konwencje wywo³ania przeci¹ anie DEL-3(3 z 65)
Biblioteki ³¹czone dynamicznie (w skrócie: biblioteki DLL od ang. dynamic-link libraries) s³u ¹ do wspólnego u ywania kodów programowych i zasobów (danych definiuj¹cych wizualne czêœci programów uruchamianych w œrodowisku Windows) przez ró ne programy i inne biblioteki DLL. Jêzyk Delphi Pascal umo liwia zarówno korzystanie z istniej¹cych bibliotek DLL, jak i zaprogramowanie przez u ytkownika w³asnych bibliotek tego typu. DEL-3(4 z 65)
Biblioteka ³¹czona dynamicznie jest wykonywaln¹ jednostk¹ programow¹ zawieraj¹c¹ kod programowy lub zasoby. W postaci skompilowanej jest pamiêtana w zbiorze dyskowym o rozszerzeniu nazwy DLL. Podobieñstwo bibliotek DLL do modu³ów: obie struktury programowe zawieraj¹ procedury i funkcje wykorzystywane przez programy, modu³y i inne biblioteki DLL DEL-3(5 z 65)
Ró nice pomiêdzy bibliotekami DLL i modu³ami: sposób do³¹czania do jednostek programowych (programów, modu³ów i innych bibliotek DLL), modu³y umo liwiaj¹ nie tylko wykorzystanie w programie procedur i funkcji, ale tak e litera³ów, typów i zmiennych w nich zdefiniowanych (w czêœci opisowej), a z bibliotek DLL mog¹ byæ eksportowane tylko procedury i funkcje. DEL-3(6 z 65)
Dostêp do procedur i funkcji W celu u ycia w programie (module, bie ¹cej bibliotece ³¹czonej dynamicznie) procedury lub funkcji zdefiniowanej w danej bibliotece DLL nale y w czêœci opisowej programu (modu³u, bie ¹cej biblioteki DLL) zadeklarowaæ dan¹ procedurê lub funkcjê z dyrektyw¹ external. Dyrektywa external okreœla odpowiedni¹ bibliotekê DLL i wi¹ e deklaracjê z procedur¹ lub funkcj¹, która jest w niej zdefiniowana. DEL-3(7 z 65)
Dostêp do procedur i funkcji Przyk³ad function okienko_komunikatu (identyfikator : Integer; komunikat, nag³ówek : PChar; znaczniki : Integer) : Integer; stdcall; external user32.dll name MessageBoxA ; Dyrektywa jêzyka stdcall okreœla konwencjê wywo³ania funkcji. DEL-3(8 z 65)
Dostêp do procedur i funkcji Dla bibliotek DLL napisanych w jêzyku Delphi Pascal, które bêd¹ wywo³ywane tylko w jednostkach programowych (programach, modu³ach i innych bibliotekach DLL) napisanych tak e w tym jêzyku, okreœlanie konwencji wywo³ania nie jest konieczne (domyœln¹ konwencjê okreœla dyrektywa register). W przypadku korzystania z bibliotek DLL napisanych w innych jêzykach lub w bibliotekach pisanych w jêzyku Delphi Pascal, ale przeznaczonych do wykorzystania w innych jêzykach programowania, nale y w deklaracjach funkcji i procedur podawaæ dyrektywê stdcall. DEL-3(9 z 65)
Dostêp do procedur i funkcji Program (modu³, bie ¹ca biblioteka DLL) napisany w jêzyku Delphi Pascal mo e pobraæ procedurê lub funkcjê z danej biblioteki DLL przez : nazwê, now¹ (inn¹) nazwê, liczbê porz¹dkow¹. W ka dym z tych sposobów postaæ dyrektywy external jest inna. DEL-3(10 z 65)
Dostêp do procedur i funkcji Import poprzez nazwê oznacza, e w tablicy nazw odpowiedniej biblioteki DLL bêdzie poszukiwany identyfikator danej procedury lub funkcji (po przekszta³ceniu wszystkich ma³ych liter na wielkie). Dyrektywa external ma w tym przypadku postaæ external nazwa-biblioteki; gdzie nazwa biblioteki w ogólnoœci oznacza sta³e wyra enie ³añcuchowe. Uwaga: Ró nice pomiêdzy Windows 98, Me i XP a NT i 2000. DEL-3(11 z 65)
Dostêp do procedur i funkcji Przyk³ady 1) procedure proc_a; external PROCDLL.DLL ; Jeœli wczeœniej zdefiniujemy sta³¹ ³añcuchow¹ biblioteka_1 nastêpuj¹co: const biblioteka_1 = PROCDLL.DLL ; to podan¹ deklaracjê procedury proc_a mo na zast¹piæ deklaracj¹ procedure proc_a; external biblioteka_1; 2) function NWP (const a, b : Longint) : Longint; external NUMLIB.DLL ; DEL-3(12 z 65)
Dostêp do procedur i funkcji Jeœli nazwa procedury lub funkcji w programie (module, bie ¹cej bibliotece DLL) ma byæ inna ni nazwa, za pomoc¹ której eksportuje siê j¹ z danej biblioteki, to nale y zastosowaæ importowanie przez now¹ (inn¹) nazwê. Dyrektywa external ma w tym przypadku postaæ external nazwa-biblioteki name nazwa-importowa; DEL-3(13 z 65)
Dostêp do procedur i funkcji Przyk³ad function podzielnik (const a, b : Longint) : Longint; external NUMLIB.DLL name NWP ; DEL-3(14 z 65)
Dostêp do procedur i funkcji Import przez liczbê porz¹dkow¹ jest najbardziej efektywny, gdy w tym przypadku odpowiedni identyfikator nie jest poszukiwany w tablicy nazw biblioteki. Liczba porz¹dkowa procedury lub funkcji jest w bibliotece DLL ustalona za pomoc¹ klauzuli exports (bêdzie dalej). Dyrektywa external odwo³uj¹ca siê do tej liczby ma postaæ external nazwa-biblioteki index liczba-porz¹dkowa; DEL-3(15 z 65)
Dostêp do procedur i funkcji Przyk³ad procedure proc_b; external PROCDLL.DLL index 15; Jeœli wczeœniej okreœlono nastêpuj¹ce sta³e: const biblioteka_1 = PROCDLL.DLL ; liczba_porz = 15; to podan¹ deklaracjê mo na zast¹piæ deklaracj¹ procedure proc_b; external biblioteka_1 index liczba_porz; DEL-3(16 z 65)
Modu³y importowe Procedury i funkcje mog¹ byæ pobierane z bibliotek DLL do programów (modu³ów, innych bibliotek DLL) w sposób bezpoœredni (opisany bli ej) lub w sposób poœredni z modu³ów, które zawieraj¹ odpowiednie deklaracje. Modu³y takie nazywamy modu³ami importowymi. Zalety stosowania modu³ów importowych: a) mo liwoœæ umieszczania w ich czêœciach opisowych definicji i deklaracji sta³ych, typów i zmiennych, które u³atwiaj¹ dostêp do procedur i funkcji (bezpoœrednie odwo³anie siê w programie do sta³ych, typów i zmiennych zdefiniowanych w bibliotece DLL nie jest mo liwe), b) po modyfikacji jakiejœ biblioteki wystarczy zmieniæ tylko odpowiedni modu³, a nie wszystkie programy (inne modu³y, biblioteki DLL), które korzystaj¹ z danej biblioteki. DEL-3(17 z 65)
Przyk³ad unit cplcproc; interface type complex = record re, im : Extended end; Biblioteki DLL Modu³y importowe function addcplx (const a, b : complex) : complex; function subcplx (const a, b : complex) : complex; function multcplx ( const a, b : complex) : complex; function divcplx ( const a, b : complex) : complex; implementation function addcplx; external CPLXPROC.DLL index 1; function subcplx; external CPLXPROC.DLL index 2; function multcplx; external CPLXPROC.DLL index 3; function divcplx; external CPLXPROC.DLL index 4; end. DEL-3(18 z 65)
Importowanie statyczne i dynamiczne Zastosowanie w programie (module, innej bibliotece DLL) dyrektywy jêzyka external z nazw¹ danej biblioteki powoduje ustalenie biblioteki, z której bêd¹ pobierane procedury lub funkcje w sposób jawny. Pobieranie takie, zwane importowaniem statycznym, dotyczy zawsze tej samej procedury lub funkcji w tej samej bibliotece. Jêzyk Delphi Pascal umo liwia tak e ustalenie biblioteki i pobieranej z niej procedury lub funkcji dopiero podczas wykonywania programu. Ten sposób okreœlania biblioteki procedury lub funkcji nazywa siê importowaniem dynamicznym. i DEL-3(19 z 65)
Importowanie statyczne i dynamiczne Do przeprowadzenia importowania dynamicznego s³u ¹ trzy funkcje standardowe: LoadLibrary, GetProcAddress, FreeLibrary, które s¹ zdefiniowane w module Windows. DEL-3(20 z 65)
Importowanie statyczne i dynamiczne Funkcja LoadLibrary s³u y do wczytania biblioteki DLL do pamiêci. Jej wywo³anie ma postaæ LoadLibrary (nazwa-zbioru-bibliotecznego) Argument (typu PAnsiChar) wskazuje na ³añcuch, który zawiera nazwê zbioru dyskowego z wczytywan¹ bibliotek¹. Gdy wczytanie biblioteki zakoñczy siê pomyœlnie, to wartoœci¹ funkcji jest jej identyfikator w pamiêci. Wartoœæ funkcji równa 0 oznacza b³¹d podczas wczytywania biblioteki. Ka de wywo³anie funkcji LoadLibrary dla danej biblioteki zwiêksza wewnêtrzny licznik odwo³añ do niej o jeden. DEL-3(21 z 65)
Importowanie statyczne i dynamiczne Do zwolnienia pamiêci zajêtej przez bibliotekê s³u y funkcja FreeLibrary, której wywo³anie ma postaæ FreeLibrary (identyfikator) Identyfikator oznacza argument bêd¹cy wartoœci¹ funkcji LoadLibrary, która wczyta³a dan¹ bibliotekê do pamiêci. Wartoœæ funkcji jest o tyle nieistotna, e zwykle funkcjê FreeLibrary wywo³uje siê jak procedurê. Wywo³anie funkcji FreeLibrary powoduje zmniejszenie wewnêtrznego licznika odwo³añ do danej biblioteki o jeden i jeœli licznik ten osi¹gnie wartoœæ zero zwolnienie pamiêci zajêtej przez bibliotekê. DEL-3(22 z 65)
Importowanie statyczne i dynamiczne Dostêp (dynamiczny) do funkcji i procedur biblioteki DLL, która zosta³a wczytana do pamiêci, jest mo liwy poprzez adres, do którego otrzymania s³u y funkcja GetProcAddress. Jej wywo³anie jest nastêpuj¹ce: GetProcAddress (identyfikator, nazwa-funkcji-lub-procedury) gdzie identyfikator jest wartoœci¹ funkcji LoadLibrary, a drugi argument (typu identycznego z PAnsiChar) wskazuje na ³añcuch, który zawiera nazwê ¹danej funkcji lub procedury lub te podaje jej liczbê porz¹dkow¹. W drugim przypadku bardziej znacz¹ce s³owo musi byæ zerem, a s³owo mniej znacz¹ce podawaæ odpowiedni¹ liczbê. Wartoœci¹ funkcji GetProcAddress jest adres ¹danej funkcji lub procedury, lub wartoœæ nil, gdy funkcji lub procedury nie odnaleziono. DEL-3(23 z 65)
Importowanie statyczne i dynamiczne Przyk³ad program programdll; {$APPTYPE CONSOLE} uses SysUtils, Windows;... type complex = record re, im : Extended end; var ident_1, ident_2 : HMODULE;... addcplx min deklaracja zmiennych do przechowywania identyfikatorów bibliotek : function (const a, b : complex) : complex; : function (const a, b : Extended) : Extended; deklaracja zmiennych proceduralnych reprezentuj¹cych w programie funkcje z biblioteki DEL-3(24 z 65)
Importowanie statyczne i dynamiczne Przyk³ad (cd.) begin ident_1:=loadlibrary( C:\DELPHI\BIBL\CPLXPROC.DLL ); ident_2:=loadlibrary( A:\MIN_MAX.DLL ); wczytanie bibliotek do pamiêci if ident_1<>0 then @addcplx:= GetProcAddress(ident_1, PAnsiChar(1)); import dynamiczny przez liczbê porz¹dkow¹ DEL-3(25 z 65)
Importowanie statyczne i dynamiczne Przyk³ad (cd.) if ident_2<>0 then @min:=getprocaddress(ident_2, MIN ); if @addcplx<>nil then begin... end; if @min<>nil then begin... end; import dynamiczny przez nazwê mo liwoœæ wywo³ania funkcji addcplx mo liwoœæ wywo³ania funkcji min DEL-3(26 z 65)
Importowanie statyczne i dynamiczne Przyk³ad (cd.) if (@addcplx<>nil) and (@min<>nil) then begin... end; mo liwoœæ wywo³ania obu funkcji FreeLibrary (ident_1); FreeLibrary (ident_2);... end. usuniêcie bibliotek z pamiêci DEL-3(27 z 65)
Tworzenie bibliotek DLL Struktura biblioteki DLL jest nastêpuj¹ca: library nazwa-biblioteki; deklaracje-modu³ów czêœæ-opisowa begin ci¹g-instrukcji end. Sposób przekazywnia procedur i funkcji eksportowanych z biblioteki do programów lub modu³ów jest okreœlony w czêœci opisowej dodatkowymi klauzulami exports. Czêœæ wykonawcza bloku spe³nia rolê czêœci inicjuj¹cej biblioteki DLL. DEL-3(28 z 65)
Tworzenie bibliotek DLL W czêœci opisowej biblioteki wystêpuj¹ definicje funkcji i procedur eksportowalnych oraz (po nich) klauzule exports: exports lista-eksportowa; Elementy listy eksportowej oddziela siê przecinkami, a ka dy z nich mo e mieæ jedn¹ z nastêpuj¹cych postaci: identyfikator identyfikator index liczba-porz¹dkowa identyfikator index liczba-porz¹dkowa name nazwa identyfikator name nazwa Dodatkowo na koñcu ka dego elementu listy eksportowej mo e wyst¹piæ s³owo (dyrektywa jêzyka) resident. DEL-3(29 z 65)
Tworzenie bibliotek DLL Identyfikator wystêpuj¹cy w ka dym elemencie listy klauzuli exports jest nazw¹ odpowiedniej funkcji lub procedury eksportowej. Jeœli w elemencie listy klauzuli exports wystêpuje dyrektywa jêzyka index, oznacza to, e eksport funkcji lub procedury mo e odbyæ siê poprzez podan¹ liczbê porz¹dkow¹. Liczba ta jest sta³¹ ca³kowit¹ i mo e mieæ wartoœæ od 1 do 2 147 483 647. DEL-3(30 z 65)
Tworzenie bibliotek DLL Wyst¹pienie dyrektywy jêzyka name umo liwia eksport funkcji lub procedury za pomoc¹ wyspecyfikowanej nazwy, któr¹ podaje siê w postaci ³añcucha. Brak dyrektywy name oznacza, e nazw¹ eksportow¹ jest identyfikator danej funkcji lub procedury, którego wszystkie ma³e litery zosta³y zamienione na wielkie. Nazwa wystêpuj¹ca w dyrektywie name elementu listy klauzuli exports jest t¹ sam¹ nazw¹, któr¹ podaje siê po s³owie name w dyrektywie external w deklaracji importowanej funkcji lub procedury w programie, module lub innej bibliotece DLL. DEL-3(31 z 65)
Tworzenie bibliotek DLL Po wczytaniu biblioteki DLL do pamiêci dla elementów listy klauzuli exports, zawieraj¹cych s³owo resident, informacje o ich nazwach eksportowych s¹ przechowywane w pamiêci, co powoduje skrócenie czasu dostêpu do funkcji i procedur importowanych przez nazwê. Podane dalej przyk³ady przedstawiaj¹ ró ne sposoby ustanawiania ³¹cz pomiêdzy bibliotek¹ i programem w zale noœci od postaci klauzuli exports w bibliotece. DEL-3(32 z 65)
Tworzenie bibliotek DLL Przyk³ad library min_max; function min (const a, b : Extended) : Extended; begin... end; function max (const a, b : Extended) : Extended; begin... end; exports min, max; begin end. DEL-3(33 z 65)
Tworzenie bibliotek DLL Przyk³ad Deklaracje w programie: function min (const a, b : Extended) : Extended; external MIN_MAX.DLL ; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL ; Z uwagi na standardowe przyjêcie nazw eksportowych w bibliotece, deklaracje funkcji min i max w programie mog¹ byæ tak e nastêpuj¹ce: function min (const a, b : Extended) : Extended; external MIN_MAX.DLL name MIN ; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL name 'MAX'; DEL-3(34 z 65)
Tworzenie bibliotek DLL Przyk³ad Nastêpuj¹ce deklaracje s¹ b³êdne: function min (const a, b : Extended) : Extended; external MIN_MAX.DLL index 1; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL index 2; Podczas wykonywania programu wyst¹pi warunek b³êdu EAccessViolation. Poniewa importowanie funkcji odbywa siê przez nazwy, w celu skrócenia czasu dostêpu do nich mo na w klauzulê exports zapisaæ w postaci: exports min resident, max resident; DEL-3(35 z 65)
Tworzenie bibliotek DLL Przyk³ad Dla klauzuli exports postaci exports min name MINAB resident, max name MAXAB resident; deklaracje funkcji w programie powinny byæ nastêpuj¹ce: function min (const a, b : Extended) : Extended; external MIN_MAX.DLL name MINAB ; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL name MAXAB ; DEL-3(36 z 65)
Tworzenie bibliotek DLL Przyk³ad Mo liwe jest te nadanie tym funkcjom w programie nowych nazw: function minimum (const a, b : Extended) : Extended; external MIN_MAX.DLL name MINAB ; function maximum (const a, b : Extended) : Extended; external MIN_MAX.DLL name MAXAB ; Nazwa funkcji (lub procedury) w bibliotece, nazwa eksportowa i nazwa funkcji (procedury) w programie (lub module) mog¹ byæ ró ne! DEL-3(37 z 65)
Tworzenie bibliotek DLL Przyk³ad Je eli klauzula exports bêdzie mia³a postaæ exports min index 1, max index 2; to w programie poprawna bêdzie ka da z poni szych deklaracji: function minimum (const a, b : Extended) : Extended; external MIN_MAX.DLL index 1; function maximum (const a, b : Extended) : Extended; external MIN_MAX.DLL index 2; function minimum (const a, b : Extended) : Extended; external MIN_MAX.DLL name MIN ; function maximum (const a, b : Extended) : Extended; external MIN_MAX.DLL name MAX ; DEL-3(38 z 65)
Tworzenie bibliotek DLL Przyk³ad Je eli klauzula exports bêdzie mia³a postaæ exports min index 1, max index 2; to w programie poprawna bêdzie ka da z poni szych deklaracji: function min (const a, b : Extended) : Extended; external MIN_MAX.DLL index 1; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL index 2; function min (const a, b : Extended) : Extended; external MIN_MAX.DLL name MIN ; function max (const a, b : Extended) : Extended; external MIN_MAX.DLL name MAX ; DEL-3(39 z 65)
Tworzenie bibliotek DLL Biblioteki ³¹czone dynamicznie mog¹ sk³adaæ siê z procedur i funkcji zdefiniowanych w kilku modu³ach. Zazwyczaj w takich przypadkach biblioteka sk³ada siê tylko z deklaracji modu³ów, klauzuli exports i czêœci inicjuj¹cej. Jej struktura jest wówczas nastêpuj¹ca: library nazwa-biblioteki ; uses modu³-1, modu³-2,..., modu³-n; exports modu³-1.nazwa-11 index 1,... modu³-1.nazwa-1k index k,... modu³-n.nazwa-n1 index m nl+n1,... modu³-n.nazwa-nl index m; begin instrukcje-inicjuj¹ce end. DEL-3(40 z 65)
Tworzenie bibliotek DLL Instrukcje czêœci inicjuj¹cej biblioteki s¹ wykonywane tylko raz, podczas wczytywania biblioteki do pamiêci. W chwili wprowadzania do programu kolejnego programu wykorzystuj¹cego dan¹ bibliotekê jest zwiêkszany specjalny licznik jej wykorzystania. Biblioteka pozostaje w pamiêci dopóty, dopóki licznik ten ma wartoœæ wiêksz¹ od zera. Dla wartoœci licznika równej zeru jest wykonywana procedura wyjœcia (zamkniêcia) biblioteki, której adres jest pamiêtany w predefiniowanej zmiennej ExitProc. DEL-3(41 z 65)
Czêœæ inicjuj¹ca zawiera zwykle: instalacjê w³asnej procedury wyjœcia, Biblioteki DLL Tworzenie bibliotek DLL instrukcje przypisuj¹ce wartoœci pocz¹tkowe zmiennym globalnym biblioteki, instrukcje rejestruj¹ce klasy okienek (dotyczy bibliotek wykorzystywanych w programach okienkowych, które napisano przy u yciu biblioteki VCL), instrukcjê sygnalizuj¹c¹ wyst¹pienie b³êdu (najczêœciej jest ona po³¹czona ze sprawdzeniem wartoœci predefiniowanej zmiennej ExitCode, której wartoœæ 0 oznacza bezb³êdne zainicjowanie biblioteki, a wartoœæ tej zmiennej ró na od 0 powoduje usuniêcie biblioteki z pamiêci, a program, który j¹ wywo³a³, sygnalizuje b³¹d wczytywania biblioteki). DEL-3(42 z 65)
Przyk³ad (zainstalowanie w³asnej procedury wyjœcia) Biblioteki DLL Tworzenie bibliotek DLL library Test; var SaveExit : Pointer; procedure LibExit; { w³asna procedura wyjœcia biblioteki } begin... { instrukcje wykonywane przed usuniêciem biblioteki z pamiêci } ExitProc:=SaveExit end; begin... { inicjowanie biblioteki } SaveExit:= ExitProc; { zapamiêtanie wskaÿnika procedury wyjœcia } ExitProc:=@LibExit { zainstalowanie procedury wyjœcia LibExit } end. DEL-3(43 z 65)
B³êdy wykonania w bibliotekach DLL W przypadku wyst¹pienia w bibliotece DLL, w której zadeklarowano modu³ SysUtils, warunku b³êdu lub stanu wyj¹tkowego i nieobs³u enia go, warunek ten jest propagowany na zewn¹trz biblioteki. Gdy biblioteka zosta³a wywo³ana z programu napisanego w jêzyku Delphi Pascal, to warunek mo e byæ w nim obs³u ony za pomoc¹ instrukcji try...except. DEL-3(44 z 65)
B³êdy wykonania w bibliotekach DLL Jeœli jednak dan¹ bibliotekê wywo³a program napisany w innym jêzyku, to nale y go w nim obs³u yæ jako warunek b³êdu œrodowiska Windows o kodzie $0EEDFACE. Informacja o adresie b³êdu jest zawarta w pierwszym elemencie tablicy ExceptionInformation rekordu œrodowiska Windows o nazwie Exception_Record (informacje znajduj¹ siê w systemie pomocy). Drugi element tej tablicy zawiera odwo³anie do obiektu reprezentuj¹cego b³¹d w jêzyku Delphi Pascal. DEL-3(45 z 65)
B³êdy wykonania w bibliotekach DLL Jeœli w bibliotece DLL nie zadeklarowano modu³u SysUtils, to po wyst¹pieniu w niej b³êdu wykonywanie programu, który wywo³a³ bibliotekê, zostanie przerwane (program zostanie usuniêty z pamiêci). Z tego powodu nale y dok³adnie przetestowaæ tak¹ bibliotekê, aby jakiekolwiek b³êdy wykonania nie mog³y w niej wyst¹piæ. DEL-3(46 z 65)
Funkcje i procedury Rodzaje parametrów W zale noœci od sposobu przekazywania wartoœci do procedury lub funkcji, tj. zastêpowania parametrów formalnych argumentami, wyró niamy 10 rodzajów parametrów: parametry przekazywane przez wartoœci, parametry przekazywane przez sta³e okreœlonego typu, parametry przekazywane przez zmienne okreœlonego typu, parametry przekazywane przez sta³e nieokreœlonego typu, parametry przekazywane przez zmienne nieokreœlonego typu, DEL-3(47 z 65)
Funkcje i procedury Rodzaje parametrów W zale noœci od sposobu przekazywania wartoœci do procedury lub funkcji, tj. zastêpowania parametrów formalnych argumentami, wyró niamy 10 rodzajów parametrów: parametry wyjœciowe okreœlonego typu, parametry wyjœciowe nieokreœlonego typu, parametry otwarte, otwarte parametry tablicowe typu wariantowego, parametry o domyœlnej wartoœci. DEL-3(48 z 65)
Funkcje i procedury Parametry przekazywane przez wartoœci Deklaracja: lista-parametrów : typ Poszczególne parametry listy parametrów oddziela siê przecinkami. Typ oznacza identyfikator typu lub s³owo kluczowe string. Dla parametrów typu ³añcuchowego ( string) nie jest dozwolona specyfikacja d³ugoœci ³añcucha. Je eli parametr jest przekazywany przez wartoœæ, to w wywo³aniu procedury (funkcji) odpowiadaj¹cy mu argument mo e byæ wyra eniem. Parametry przekazywane przez wartoœci nie mog¹ byæ typu plikowego i typu strukturalnego o elementach sk³adowych typu plikowego. DEL-3(49 z 65)
Funkcje i procedury Parametry przekazywane przez sta³e okreœlonego typu Deklaracja: const lista-parametrów : typ Parametry tego rodzaju s¹ w treœci procedury lub funkcji traktowane jako zmienne lokalne przeznaczone tylko do odczytu. Argument wywo³ania odpowiadaj¹cy parametrowi przekazywanemu przez sta³¹ okreœlonego typu w ogólnoœci mo e byæ wyra eniem, ale jego typ musi byæ zgodny w sensie przypisania z typem parametru formalnego. Dla parametrów typu ³añcuchowego i strukturalnego zaleca siê stosowaæ parametry przekazywane przez sta³e zamiast przekazywanych przez wartoœci, gdy kompilator generuje dla nich bardziej efektywny kod wynikowy. DEL-3(50 z 65)
Funkcje i procedury Parametry przekazywane przez zmienne okreœlonego typu Deklaracja: var lista-parametrów : typ Argumenty odpowiadaj¹ce parametrom przekazywanym przez zmienn¹ okreœlonego typu musz¹ byæ zmiennymi. Typ odpowiedniej zmiennej musi byæ przy tym identyczny z typem parametru formalnego. Zastosowanie tych parametrów do przekazywania elementów tablic wariantowych nie jest dozwolone. Parametry typu plikowego mog¹ byæ przekazywane tylko przez zmienn¹. DEL-3(51 z 65)
Funkcje i procedury Parametry przekazywane przez sta³e i zmienne nieokreœlonego typu Deklaracje: const lista-parametrów var lista-parametrów Argumenty im odpowiadaj¹ce mog¹ byæ litera³ami lub zmiennymi dowolnych typów. W treœci procedury (funkcji) parametry te nie s¹ zgodne z adnymi innymi zmiennymi. Zgodnoœæ tê uzyskuje siê za pomoc¹ konstrukcji zmiany typu zmiennej, która nadaje parametrom odpowiednie typy. Parametry nieokreœlonego typu s³u ¹ g³ównie do konstrukcji procedur i funkcji przetwarzaj¹cych podobne struktury danych, ale o ró nych rozmiarach. DEL-3(52 z 65)
Funkcje i procedury Parametry wyjœciowe Deklaracje: out lista-parametrów : typ out lista-parametrów Argument odpowiadaj¹cy parametrowi wyjœciowemu musi byæ zmienn¹. Parametry te s¹ przeznaczone do przekazywania wartoœci z procedury lub funkcji na zewn¹trz. Jakiekolwiek wartoœci nadane argumentom odpowiadaj¹cym parametrom wyjœciowym przed wywo³aniem procedury (funkcji) po przekazaniu do procedury (funkcji) s¹ anulowane. DEL-3(53 z 65)
Funkcje i procedury Parametry otwarte Deklaracje: var parametr : array of identyfikator-typu const parametr : array of identyfikator-typu parametr : array of identyfikator-typu Zastosowanie tych parametrów umo liwia przekazywanie do tej samej procedury lub funkcji tablic o ró nych rozmiarach. Parametr aktualny (argument) odpowiadaj¹cy tablicowemu parametrowi otwartemu musi byæ zmienn¹ typu okreœlonego przez identyfikator typu lub tablic¹ elementów o typie okreœlonym przez ten identyfikator. DEL-3(54 z 65)
Funkcje i procedury Parametry otwarte W treœci procedury lub funkcji tablicowy parametr otwarty jest traktowany tak, jakby by³ zadeklarowany za pomoc¹ konstrukcji array [0..n 1] of identyfikator-typu gdzie n oznacza liczbê elementów argumentu. Jeœli argument jest zmienn¹ typu okreœlonego przez identyfikator typu, to traktuje siê go jak tablicê jednoelementow¹ o tym typie. W treœci funkcji lub procedury do okreœlenia liczby elementów tablicy otwartej stosuje siê funkcjê standardow¹ High. DEL-3(55 z 65)
Funkcje i procedury Otwarte parametry tablicowe typu wariantowego S³u ¹ do przekazywania do procedury lub funkcji tablic zawieraj¹cych wartoœci ró nych typów. Typ takiego parametru powinien byæ okreœlony za pomoc¹ konstrukcji array of const która odpowiada konstrukcji array of TVarRec gdzie TVarRec oznacza wariantowy typ rekordowy (predefiniowany w module System), który mo e reprezentowaæ wartoœci ró nych (ale nie wszystkich) typów. DEL-3(56 z 65)
Funkcje i procedury Parametry o domyœlnej wartoœci Deklaracje: const parametr : typ = wyra enie-sta³e parametr : typ = wyra enie-sta³e Parametry z domyœlnymi wartoœciami musz¹ wyst¹piæ jako ostatnie na liœcie parametrów. Ka dy parametr z domyœln¹ wartoœci¹ musi byæ przy tym specyfikowany oddzielnie (u ycie listy parametrów nie jest dozwolone). DEL-3(57 z 65)
Funkcje i procedury Konwencje wywo³ania W jêzyku Delphi Pascal wystêpuje piêæ dyrektyw (register, pascal, cdecl, stdcall i safecall), za pomoc¹ których ustala siê sposób przekazywania parametrów w funkcjach, procedurach i metodach. Ustalenia te, zwane konwencjami wywo³ania, dotycz¹: kolejnoœci przekazywania parametrów, automatycznego usuwania parametrów ze stosu, u ywania rejestrów przez parametry, obs³ugi warunków b³êdów i stanów wyj¹tkowych. DEL-3(58 z 65)
Funkcje i procedury Konwencje wywo³ania register dyrektywa domyœlna (nie wymaga okreœlania); parametry s¹ przekazywane od strony lewej do prawej, a wiêc w kolejnoœci ich wyspecyfikowania; przy przekazywaniu parametrów zostanie wykorzystanych od jednego do trzech rejestrów procesora (EAX, EDX oraz ECX); po wykonaniu funkcji lub procedury wszystkie parametry zostan¹ automatycznie usuniête ze stosu pascal jw., ale rejestry procesora nie bêd¹ u ywane DEL-3(59 z 65)
Funkcje i procedury Konwencje wywo³ania stdcall przekazywanie parametrów od strony prawej do lewej i brak u ywania w tym procesie rejestrów procesora; po zakoñczeniu wykonywania funkcji lub procedury parametry zostan¹ usuniête ze stosu cdecl jw., ale usuniêcie parametrów ze stosu musi byæ zabezpieczone w miejscu wywo³ania danej funkcji lub procedury (po jej wykonaniu i przekazaniu z niej sterowania); zaprogramowanie odpowiednich instrukcji (zwykle w asemblerze) jest zadaniem programisty. safecall dotyczy wy³¹cznie metod ³¹cz dualnych (pomijamy) DEL-3(60 z 65)
Funkcje i procedury Konwencje wywo³ania Domyœlna konwencja wywo³ywania ( register) jest najbardziej efektywna, gdy wskutek wykorzystywania rejestrów procesora czêsto nie potrzeba umieszczaæ parametrów w stosie (dzieje siê tak zawsze, gdy liczba parametrów nie przekracza trzech). Konwencje okreœlone dyrektywami pascal i cdecl stosuje siê zwykle przy wywo³ywaniu funkcji i procedur z bibliotek ³¹czonych dynamicznie napisanych w jêzykach C, C++ lub innych. W przypadku wywo³ywania funkcji œrodowiska Windows stosuje siê konwencjê okreœlon¹ dyrektyw¹ stdcall. DEL-3(61 z 65)
Funkcje i procedury Przeci¹ anie W obrêbie tego samego zakresu wa noœci identyfikatorów mo na zdefiniowaæ wiêcej ni jedn¹ funkcjê i (lub) procedurê o takiej samej nazwie. Wielokrotne definiowanie funkcji i procedur o takich samych nazwach nazywa siê przeci¹ aniem (ang. overloading). W definicjach funkcji i procedur przeci¹ anych jest konieczne wyspecyfikowanie dyrektywy jêzyka overload. DEL-3(62 z 65)
Funkcje i procedury Przeci¹ anie Jeœli dwie lub wiêcej funkcji i (lub) procedur przeci¹ onych ma tak¹ sam¹ nazwê, to powstaje pytanie: w jaki sposób nastêpuje identyfikacja odpowiedniej funkcji i (lub) procedury w chwili wywo³ania? Odpowiedzi¹ na to pytanie jest regu³a, e takie funkcje i procedury musz¹ ró niæ siê liczb¹ lub typami parametrów. W chwili wywo³ania funkcji lub procedury przeci¹ onej w³aœnie po liczbie lub typach argumentów nastêpuje odpowiednia identyfikacja. DEL-3(63 z 65)
Funkcje i procedury Przeci¹ anie Przyk³ad Za³ó my, e zdefiniowano dwie funkcje przeci¹ one: function suma (a, b, c : Real) : Real; overload ; begin Result:=a+b+c end; function suma (a, b, c : Integer) : Integer; overload ; begin Result:=a+b+c end; W instrukcji x:=suma(1, 2, 3); zostanie wywo³ana druga funkcja suma, a w instrukcji z:=suma(1, 2, 3.0); pierwsza (pierwsze dwa argumenty zostan¹ zamienione na typ Real). DEL-3(64 z 65)
... to ju (dopiero) koniec na dzisiaj... DEL-3(65 z 65)