Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałAmadeusz Okraska Został zmieniony 10 lat temu
1
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY
2
Jerzy F. Kotowski 2 DEKLARATORY - filozofia F Język C pozwala na deklarowanie u obiektów typu podstawowego u tablic obiektów u wskaźników do obiektów oraz funkcji zwracających obiekty. F Do tworzenia obiektów służą DEKLARATORY. F Podstawowym elementem każdego deklaratora jest identyfikator (nazwa obiektu). F Jeżeli deklarator zawiera niezmodyfikowany identyfikator, to tworzy on obiekt typu podstawowego.
3
Jerzy F. Kotowski 3 MODYFIKATORY F Do modyfikowania identyfikatorów w deklaratorach służą modyfikatory. F Język C ma trzy modyfikatory (C++ ma cztery) * modyfikuje obiekt do pointer type [] modyfikuje obiekt do array type () modyfikuje obiekt do function returning type & modyfikuje obiekt do tzw. alias name - C++ W deklaratorach można używać nawiasów w celu wymuszenia interesującej nas kolejności interpretacji poszczególnych modyfikatorów. F Każdy kompletny deklarator musi zawierać specyfikator typu.
4
Jerzy F. Kotowski 4 PRZYKŁADY F Deklaratory z niemodyfikowanym identyfikatorem int Ala; struct complex Ola; F Deklaratory z jednym modyfikatorem int *Ala; char Ela[10]; struct complex Ola(void); Ostatni deklarator deklaruje funkcję bez argumentów o nazwie Ola zwracającą obiekt typu struct complex.
5
Jerzy F. Kotowski 5 DEKLARATORY ZŁOŻONE F Deklarator złożony to taki, który zawiera więcej niż jeden modyfikator. F OGRANICZENIA JĘZYKA C u Elementami tablicy nie mogą być funkcje u Funkcja nie może zwracać tablicy u Funkcja nie może zwracać funkcji F PRIORYTETY MODYFIKATORÓW [] oraz () mają wyższy priorytet niż * [] oraz () mają względem siebie identyczny priorytet i są interpretowane w kolejności od lewej strony do prawej
6
Jerzy F. Kotowski 6 KONSEKWENCJE (oczywiste) int *Ala[10]; Ala jest 10-elementową tablicą wskaźników do obiektów typu int. int (*Ala)[10]; Ala jest wskaźnikiem do 10-elementowej tablicy obiektów typu int. double *Ela(void); Ela jest funkcją bez argumentów zwracającą wskaźnik do obiektu typu double. double (*Ela)(void); Ela jest wskaźnikiem do funkcji bez argumentów zwracającej obiekt typu double.
7
Jerzy F. Kotowski 7 DWIE PRAWDY (też oczywiste) F Stara prawda: Nazwa tablicy jest adresem do zajmowanego przez nią obszaru pamięci (do jej zerowego elementu) u int *Ala; u int Ola[10]; Ala=Ola; F Nowa prawda: Nazwa funkcji jest adresem do zajmowanego przez nią obszaru pamięci u int (*Ala)(void); u int Ola(void); u Ala=Ola; 14_1
8
Jerzy F. Kotowski 8 Interpretowanie deklaratorów złożonych F Idea: from the inside out. F Algorytm interpretowania deklaratorów złożonych u Krok 1 Znaleźć identyfikator lub miejsce gdzie powinien on być Krok 2 Zinterpretować znaczenie modyfikatorów [] i () po prawej stronie (jeżeli takie są) Krok 3 Zinterpretować znaczenie modyfikatora * po lewej stronie Krok 4 Jeżeli przy przesuwaniu się w prawo natrafi się na prawy nawias ) to wtedy należy znaleźć lewy nawias ( od tej pary nawiasów i zinterpretować wszystko, co znajduje się wewnątrz (tej pary nawiasów) zgodnie z regułami opisanymi w Kroku 2 i Kroku 3. u Krok 5 Zakończyć na specyfikatorze typu.
9
Jerzy F. Kotowski 9 PRZYKŁAD 1 char *(*(*var)())[10]; 1 1var jest 2 2wskaźnikiem do 3 3funkcji zwracającej 4 4wskaźnik do 5 5tablicy 10 elementów będących 6 6wskaźnikami do 7 7obiektów typu char.
10
Jerzy F. Kotowski 10 A teraz własnymi słowami: F dwuwymiarowa tablica wskaźników do liczb typu char: char *alfa[5][10]; F Wskaźnik, który może zapamiętać adres do takiej tablicy: char *(*beta)[10]; beta=alfa; Kompilator powinien to przeżyć! F Funkcja zwracająca adres takiego typu: char *(*gamma())[10]; F Nasz deklarator: char *(*(*delta)())[10]; F Powinno się udać: delta=gamma; 14_2
11
Jerzy F. Kotowski 11 Znowu przykłady Przykład 2: long *var(long,long); var jest funkcją o dwóch argumentów typu long zwracającą adres do obiektu typu long. Przykład 3: long (*var)(long,long); var jest wskaźnikiem do funkcji o dwóch argumentów typu long i zwracającej wartość typu long. Powinno się udać: long Ola(long x,long y) { return x+y; } …………………………. var=Ola;
12
Jerzy F. Kotowski 12 Przykłady, przykłady... Przykład 4: struct complex { float Re,Im; }; …………………………... struct complex (*var[5])(struct complex); var jest 5 elementową tablicą adresów do funkcji o jednym argumencie typu struct complex zwracających obiekt takiego samego typu. Przykład 5: struct complex {float Re,Im;}(*var[5])(struct complex); Równoczesna definicja typu strukturalnego complex i deklaracja identyfikatora var. Przykład 6: int *var[5](void); u 5 elementowa tablica funkcji …… ERROR!!
13
Jerzy F. Kotowski 13 TABLICA ADRESÓW DO FUNKCJI Program Inf_14_3.cpp double f0(double x) { return x;} double (*p_f[5])(double)={f0,sin,cos,log,exp}; F Komentarz: log(x) - logarytm naturalny x F Przy okazji: deklaracja tablicy adresów do tekstów z równoczesną inicjalizacją char *nazwa[5]={x,sin(x), … i tak dalej... F Przykład użycia: printf(%8s,nazwa[i]); F Najważniejsze miejsce programu: printf(%8.2lf,(*p_f[i])(x)); 14_3
14
Jerzy F. Kotowski 14 FUNKCJA kalkulator Program Inf_14_4.cpp F Definicja funkcji kalkulator double kalk(double (*f)(double), double x) { return (*f)(x); } F Przykład wywołania y=kalk(sin,1); F Wywołanie w programie Inf_14_4.cpp printf(%8.2lf,kalk(p_f[i],x)); 14_4
15
Jerzy F. Kotowski 15 Przekazanie funkcji tablicy adresów Program Inf_14_5.cpp F W tym programie nie ma zmiennych globalnych. Wszystkie obiekty są najbliżej miejsca użycia (w tym przypadku w segmencie main). Ograniczanie dostępu jest jedną z podstawowych cech podejścia obiektowego - enkapsulacja F W segmencie main wywoływana jest funkcja wydruk. F Funkcja wydruk jest wydoływana z trzema argumentami. void wydruk((double (*(*f))(double, double x, int ile) Najważniejszym elementem programu jest nagłówek funkcji wydruk. F 1-szy argument to adres do tablicy adresów do funkcji. Użycie w funkcji wydruk identyczne. 14_5
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.