1 / 14

Ogólne jednostki programowe 1

Ogólne jednostki programowe 1. Przykład Procedura Wymien W Adzie parametry formalne i parametry aktualne podprogramów muszą być zgodne. Procedura wymieniająca wartości zmiennych typu Natural procedure Wymien_Natural (N1, N2 : in out Natural) is Temp: Natural; begin Temp := N1;

sammy
Download Presentation

Ogólne jednostki programowe 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ogólne jednostki programowe 1 Przykład Procedura Wymien W Adzie parametry formalne i parametry aktualne podprogramów muszą być zgodne. Procedura wymieniająca wartości zmiennych typuNatural procedure Wymien_Natural (N1, N2 : in out Natural) is Temp: Natural; begin Temp := N1; N1 := N2; N2 := Temp; end Wymien_Natural;

  2. Ogólne jednostki programowe 2 Ta sama procedura wymieniająca wartości zmiennych typuFloat procedure Wymien_Float (F1, F2 : in out Float) is Temp: Float; begin Temp := N1; N1 := N2; N2 := Temp; end Wymien_Float; Przy wymianie danych innych typów musimy pisać nowe procedury i nigdy nie mamy pewności, że te które już napisaliśmy wyczerpią wszystkie aktualne i przyszłe potrzeby programów klienckich.

  3. Ogólne jednostki programowe 3 Wszystkie proceduryWymienmożemy umieścić w pakiecie, np.Procedury_Wymiany, ale po włączeniu do niego procedury obsługującej kolejny typ danych, musimy dokonać ponownej kompilacji tego pakietu. Podejście takie jest nieoszczędne, nieeleganckie i zawodne, bo w przypadku wykrycia i usunięciu błędów w jednej z testowanych procedur możemy zapomnieć o poprawie jednej, lub kilku pozostałych. Zadanie Czy proceduryWymien_Naturali Wymien_Floatmogą obydwie mieć nazwęWymien?

  4. Ogólne jednostki programowe 4 Ada umożliwia opracowanie jednej procedury ogólnej(generic), która po odpowiednim przystosowaniu, czyli konkretyzacji (instantiation) do aktualnie używanego typu danych może być użyta w programie klienckim wymieniającym wartości zmiennych. Procedura ogólna wymieniająca wartości typuTyp_Danych może mieć postać: procedure Wymien_Ogolnie (W1, W2 : in out Typ_Danych) is Temp: Typ_Danych; begin Temp := N1; N1 := N2; N2 := Temp; end Wymien_Ogolnie;

  5. Ogólne jednostki programowe 5 Typy jako parametry formalne jednostki ogólnej W tekście programu musimy umieścić sekcję ogólną, w której deklarujemy nazwę typu będącego typem parametrów proceduryWymien_Ogolnie, podajemy nagłówek tej procedury, a potem całą jej deklarację. Piszemy: -- Specyfikacja ogólnej procedury wymiany generic type Typ_Danych is private; procedure Wymien_Ogolnie (W1, W2 : in out Typ_Danych); -- Treść ogólnej procedury wymiany -- Tutaj wstawiamy treść pokazaną na poprzednim -- slajdzie

  6. Ogólne jednostki programowe 6 Kompilacja tej procedury daje kod gotowy do jej konkretyzacji w programie klienckim, lub w dalszej części naszego programu, w którym pojawiła się sekcja ogólna. W przypadku typówInteger i Naturalkonkretyzacje mogą mieć postać: procedure Wymien_Integer is new Wymien_Ogolnie (Typ_Danych => Integer); procedure Wymien_Float is new Wymien_Ogolnie (Typ_Danych => Float); Zadanie Czy typTyp_Danychzadeklarowany w sekcji ogólnej jakoprivate, może być typem prywatnym ograniczonym –limited private? Uzasadnij odpowiedź.

  7. Ogólne jednostki programowe 7 PrzykładWymiana_Ogolna W programie sekcja ogólna i treść procedury ogólnej znajdują się w części deklaracyjnej programu. Drugim rozwiązaniem jest umieszczenie procedury ogólnej w pakiecie, którego część publiczna zawiera deklarację typuTyp_Danychi nagłówek naszej proceduryWymien_Ogolnie Przykład Wymiana Wymiana_Ogolna_Import

  8. Ogólne jednostki programowe 8 DefinicjaJednostka ogólna (generic unit) jest wzorcem (template) procedury, funkcji, albo pakietu. Jednostka ogólna definiowana jest z parametrami formalnymi, którymi zazwyczaj są typy danych, ale mogą nimi być też nazwy procedur i funkcji. Podprogramy jako parametry formalne jednostki ogólnej Przykład Weźmy pod uwagę funkcję obliczającą wartość większego z jej dwóch argumentów typuInteger.

  9. Ogólne jednostki programowe 9 function Maksimum (A, B : in Integer) return Integer is Wynik : Integer; begin if A > B then Wynik := A; else Wynik := B; end if; return Wynik; end Maksimum; Chcemy skonstruować ogólną funkcjęMaksimum wyznaczającą wartość większego z dwóch jej argumentów, niezależnie od tego jakiego są typu. Możemy oczywiście użyć ogólnego typu parametrów formalnych, aby poinformować kompilator, że konkretyzacja może dotyczyć dowolnego typu.

  10. Ogólne jednostki programowe 10 Nie jest to jednak w rozpatrywanym przypadku informacja wystarczająca ponieważ nie wszystkie typy mogące konkretyzować naszą funkcję ogólną mają zdefiniowaną wstępnie relację większości, używaną w części operacyjnej tej funkcji. Możemy oczywiście napisać odpowiednią funkcję obliczającą wartość tej relacji w przypadku podanego w konkretyzacji typu, ale kompilator musi posiadać informację, że ma tej funkcji użyć. W sekcji ogólnej umieszcza się informację, że taka funkcja istnieje. Piszemy:

  11. Ogólne jednostki programowe 11 Sekcja ogólna generic type Typ_Danych is private; withfunction Wiekszy(L, R : Typ_Danych) return Boolean; function Maksimum (W1, W2 : Typ_Danych) return Typ_Danych;

  12. Ogólne jednostki programowe 12 Treść funkcji ogólnej function Maksimum (W1, W2 : Typ_danych) return Typ_danych is begin if Wiekszy(W1, W2) then return W1; else return W2; end if; end Maksimum;

  13. Ogólne jednostki programowe 13 Konkretyzacja w przypadku typu standardowegoFloatmoże mieć postać: function Maksimum_Float is new Maksimum (Typ_Danych => Float, Wiekszy => ">"); Trzeba jednak pamiętać, że kompilator nie może sprawdzić, czy przy konkretyzacji stosujemy właściwą funkcję wyznaczającą wartość relacji Wiekszy. Moglibyśmy również napisać function Maksimum_Float is new Maksimum (Typ_Danych => Float, Wiekszy => "<");

  14. Ogólne jednostki programowe 14 PrzykładObliczanie_Maksimum

More Related