Podstawy programowania (język C) Globalne / Lokalne Wykład 15. Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Zmienne globalne / lokalne (1) int A, *Q; // definicja zmiennych globalnych A i Q static int B; // definicja zmiennej B lokalnej w treści pliku extern int C; // deklaracja zmiennej globalnej C zdefiniowanej // być moŝe w innym pliku void fun ( int a ) // parametr a jest zmienną lokalną w treści funkcji int b, *p; // definicja zmiennych b, p lokalnych w treści funkcji static int c; // definicja zmiennej c lokalnej w treści funkcji extern int D; // deklaracja zmiennej globalnej D zdefiniowanej // być moŝe w innym pliku b = a; p = ( int* ) malloc ( sizeof ( int ) ); // utworzenie zmiennej kontrolowanej *p Q = ( int* ) calloc ( 1, sizeof ( int ) ); // utworzenie zmiennej kontrolowanej *Q *p = 5; *Q = 6; free(p); // zmienna *p "znika" return; // zmienne a, b, p "znikają", // zmienne c (lokalna), *Q (kontrolowana) zachowują swoje wartości Zmienne globalne / lokalne (2) Podział obiektów globalne / lokalne związany jest z miejscem ich tworzenia. globalne - tworzone na zewnątrz definicji funkcji i potencjalnie dostępne w treści kaŝdej funkcji, w której widoczna jest ich deklaracja, jeŝeli nie jest ona przesłonięta deklaracją lokalną; lokalne - tworzone wewnątrz definicji funkcji i dostępne tylko w treści tej funkcji, tam gdzie nie przesłaniają ich inne deklaracje lokalne.... kontrolowane - tworzone są wewnątrz definicji funkcji i w tym sensie mogły by być zaliczone do lokalnych; szczególnie wtedy, gdy są "kontrolowane" za pomocą wskaźnika lokalnego. JeŜeli jednak są one "kontrolowane" za pomocą wskaźnika globalnego, to bardziej przypominają obiekty globalne. UWAGA 1: W języku C definicja funkcji nie moŝe być zawarta w definicji innej funkcji. Zatem funkcje są obiektami globalnymi. UWAGA 2: Parametry funkcji uwaŝa się za zdefiniowane w jej treści. Zatem parametry funkcji są obiektami lokalnymi. Tomasz Marks - Wydział MiNI PW -3- Tomasz Marks - Wydział MiNI PW -4-
Zmienne statyczne / dynamiczne (1) int A, *Q; // A - statyczna (wartość 0), Q statyczna (wartość NULL) static int B; // statyczna (wartość 0) extern int C; // statyczna (wartość nieznana) Statyczne / Dynamiczne void fun ( int a ) // dynamiczna (automatyczna) (wartość okr. argumentem) int b, *p; // dynamiczne (automatyczne) (wartości nieokreślone) static int c; // statyczna (wartość 0 przy pierwszym wywołaniu) extern int D; // statyczna (wartość nieznana) b = a; p = ( int* ) malloc ( sizeof ( int ) ); // dynam. (kontrolowana) (wartość nieokreślona) Q = ( int* ) calloc ( 1, sizeof ( int ) ); // dynam. (kontrolowana) (wartość 0) *p = 5; *Q = 6; free(p); // zmienna kontrolowana *p "znika" return; // zmienne automatyczne a, b, p "znikają", // zmienne c (statyczna), *Q (kontrolowana) zachowują swoje wartości Tomasz Marks - Wydział MiNI PW -5- Tomasz Marks - Wydział MiNI PW -6- Zmienne statyczne / dynamiczne (2) Podział obiektów statyczne / dynamiczne związany jest z czasem ich istnienia. statyczne - istnieją od momentu ich utworzenia (wydzielenia dla nich pamięci) do zakończenia działania programu. Zaliczamy do nich: wszystkie obiekty globalne, obiekty lokalne zadeklarowane z atrybutem static. dynamiczne - mogą się pojawiać (gdy zostanie dla nich wydzielona pamięć) i znikać (gdy wydzielona dla nich pamięć zostanie zwolniona) w takcie działania programu. Zaliczamy do nich: obiekty automatyczne (lokalne zadeklarowane bez atrybutu static), obiekty kontrolowane Zmienne statyczne / dynamiczne (3) statyczne obiekty globalne - tworzone na początku działania programu; istnieją aŝ do zakończenia jego działania. obiekty lokalne zadeklarowane z atrybutem static - tworzone najpóźniej w chwili pierwszego uruchomienia funkcji, w której są zdefiniowane; istnieją aŝ do zakończenia działania programu. dynamiczne obiekty automatyczne - tworzone przy kaŝdym wykonaniu bloku programowego, w którym są zdefiniowane; istnieją tylko do zakończenia wykonania tego bloku. obiekty kontrolowane - tworzenie (wydzielanie pamięci) i usuwanie (zwalnianie pamięci) jest całkowicie kontrolowane przez program (programistę). Tomasz Marks - Wydział MiNI PW -7- Tomasz Marks - Wydział MiNI PW -8-
Zadanie na koniec C vs C++ Chcemy napisać program, który umoŝliwi wykonywanie prostych obliczeń na liczbach zespolonych. Zadanie zrealizujemy najpierw w języku C. Następnie zobaczymy, jak moŝe to wyglądać w języku C++. Tomasz Marks - Wydział MiNI PW -9- Tomasz Marks - Wydział MiNI PW -10- #include <stdio.h> #include <math.h> Przykład #1 ( C ) w języku C void main ( void ) // zespolone x, y z double xre, xim, yre, yim, zre, zim; double result; scanf ( %lf%lf, &xre, &xim ); // odczyt x scanf ( %lf%lf, &yre, &yim ); // odczyt y zre = xre + yre; // z = x + y zim = xim + yim; // z = x + y result = sqrt ( zre*zre + zim * zim ); // result = Abs( z ) printf( \nresult=%f\n, result ); Tomasz Marks - Wydział MiNI PW -11- Tomasz Marks - Wydział MiNI PW -12-
// progc.c #include <stdio.h> #include <math.h> Przykład #2 ( C ) typedef struct _CMPLX CMPLX; void ReadZ ( CMPLX *a ) scanf ( %lf, &a->re ); scanf ( %lf,&a->im ); double AbsZ ( CMPLX a ) return sqrt ( a.re * a.re + a.im * a.im ); CMPLX AddZ ( CMPLX a, CMPLX b ) void main ( void ) CMPLX x,y,z; double result; w języku C++ ReadZ ( &x ); ReadZ ( &y ); z = AddZ ( x, y ); result = AbsZ ( z ); printf( \nresult=%f\n, result ); Tomasz Marks - Wydział MiNI PW -13- Tomasz Marks - Wydział MiNI PW -14- #include <iostream> Przykład #2 ( C++ ) #include <iostream> Przykład #2a ( C++ ) struct CMPLX double Abs ( ) return sqrt ( Re * Re + Im * Im ); void Read ( ) cin >> Re; cin >> Im; ; CMPLX Add ( CMPLX a, CMPLX b ) int main ( ) struct CMPLX double Abs ( ) const return sqrt ( Re * Re + Im * Im ); void Read ( ) cin >> Re; cin >> Im; ; CMPLX Add ( CMPLX a, CMPLX b ) int main ( ) z = Add ( x, y ); z = Add ( x, y ); Tomasz Marks - Wydział MiNI PW -15- Tomasz Marks - Wydział MiNI PW -16-
#include <iostream> Przykład #2a ( C++ ) struct CMPLX double Abs ( ) const return sqrt ( Re * Re + Im * Im ); void Read ( ) cin >> Re >> Im; ; CMPLX Add ( CMPLX a, CMPLX b ) int main ( ) z = Add ( x, y ); Tomasz Marks - Wydział MiNI PW -17- // progcpp.cpp #include <iostream> Przykład #2b ( C++ ) struct CMPLX double Abs ( ) const return sqrt ( Re * Re + Im * Im ); void Read ( ) cin >> Re >> Im; ; CMPLX operator+ ( CMPLX a, CMPLX b ) int main ( ) z = x + y; // równowaŝne: z = operator+ ( x, y ); Tomasz Marks - Wydział MiNI PW -18- Plik nagłówkowy (definicja klasy CMPLX) // cmplx.h struct CMPLX ; double Abs ( ) const; void Read ( ); CMPLX operator+ ( CMPLX, CMPLX ); // cmplx.cpp Plik implementacyjny klasy CMPLX #include < cmath > double CMPLX :: Abs ( ) const return sqrt ( Re * Re + Im * Im ); void CMPLX :: Read ( ) cin >> Re >> Im; CMPLX operator+ ( CMPLX a, CMPLX b ) Tomasz Marks - Wydział MiNI PW -19- Tomasz Marks - Wydział MiNI PW -20-
// myprog.cpp Główny plik aplikacji UWAGA: int main ( ) x.read (); y.read (); z = x + y; W języku C++, w obrębie bloku deklaracje mogą się przeplatać z instrukcjami. Ale... (1) deklaracja zmiennej musi poprzedzać jej uŝycie ( tak jak w języku C ), (2) deklaracja nie moŝe być "przeskakiwana". Tomasz Marks - Wydział MiNI PW -21- Tomasz Marks - Wydział MiNI PW -22- Główny plik aplikacji Główny plik aplikacji // myprog.cpp int main ( ) CMPLX x, y; x.read (); y.read (); // myprog.cpp int main ( ) CMPLX x, y; x.read (); y.read (); CMPLX z; z = x + y; double result = z.abs( ); cout << \nresult= << result << endl; CMPLX z = x + y; double result = z.abs( ); cout << \nresult= << result << endl; Tomasz Marks - Wydział MiNI PW -23- Tomasz Marks - Wydział MiNI PW -24-
Koniec wykładu 15. Tomasz Marks - Wydział MiNI PW -25-