Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C...

79
Podstawy programowania Podstawy programowania w j w języku C i C++ ęzyku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione. Roman Simiński [email protected] www.us.edu.pl/~siminski Autor Kontakt

Transcript of Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C...

Page 1: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Podstawy programowaniaPodstawy programowaniaw jw języku C i C++ęzyku C i C++

Funkcje i struktura programu

Część piąta

Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa.Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne.

Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Roman Simiński

[email protected]/~siminski

Autor

Kontakt

Page 2: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Pierwsza własna funkcjaPierwsza własna funkcjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 2Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Page 3: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Pierwsza własna funkcja — jak to działa?Pierwsza własna funkcja — jak to działa?Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 3Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

» cin >> dlugosc_boku;

?dlugosc_boku

?pole

Page 4: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Pierwsza własna funkcja — przed wywołaniemPierwsza własna funkcja — przed wywołaniemPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 4Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

» pole = oblicz_pole_kwadratu( dlugosc_boku );

25dlugosc_boku

?pole

Page 5: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Pierwsza własna funkcja — wywołanie funkcji, przekazanie parametrówPierwsza własna funkcja — wywołanie funkcji, przekazanie parametrówPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 5Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

» double oblicz_pole_kwadratu( double bok )

25dlugosc_boku

25bok25

?pole

Page 6: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){

return bok * bok;

}

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Pierwsza własna funkcja — wykonanie funkcjiPierwsza własna funkcja — wykonanie funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 6Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

» return bok * bok ;

25dlugosc_boku

25bok

625

?pole

Page 7: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; }

Pierwsza własna funkcja — po powrocie funkcjiPierwsza własna funkcja — po powrocie funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 7Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

» cout << "Pole: " << pole;

25dlugosc_boku

625pole

Page 8: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; }

Pierwsza własna funkcja — drobna optymalizacjaPierwsza własna funkcja — drobna optymalizacjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 8Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Zmienna pole jest niepotrzebna, rezultat funkcji może być przekazany do strumienia wyjściowego bezpośrednio.

Page 9: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

typ_rezultatu nazwa_funkcji( lista_parametrów_formalnych ){ ciało_funkcji}

Ogólna postać definicji funkcjiOgólna postać definicji funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 9Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

double oblicz_obwod_kwadratu( double bok ){ return 4 * bok; }

double oblicz_delte( double a, double b, double c ){ return b * b – 4 * a * c; }

Przykłady prostych funkcji o charakterze obliczeniowym:

Page 10: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

A co z procedurami?A co z procedurami?Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 10Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

W języku C/C++ nie występuje podział podprogramów na procedury i funkcje.

Wszystkie podprogramy są funkcjami.

Istnieje jednak możliwość wykorzystywania funkcji jak procedur, bądź deklarowania funkcji tak, by przypominały procedury.

Słowo kluczowe void, będące nazwą typu, oznacza brak, nieobecność jakiejkolwiek wartości.

Jeżeli typem rezultatu będzie typ określany słowem kluczowym void, to oznacza, iż funkcja nie udostępnia rezultatu – staje się wtedy czymś podobnym do procedury z języka Pascal.

Page 11: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Jeżeli rezultat funkcji nie jest ważny? Procedura...Jeżeli rezultat funkcji nie jest ważny? Procedura...Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 11Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void wyswietl_info( void ){ cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: ";}

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku; wyswietl_info();

cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; }

Zadaniem funkcji jest wyprowadzenie tekstu komunikatów. Nie potrzebuje parametrów, nie oddaje rezultatu.Zadaniem funkcji jest wyprowadzenie tekstu komunikatów. Nie potrzebuje parametrów, nie oddaje rezultatu.

Page 12: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kilka słów na temat definiowania funkcjiKilka słów na temat definiowania funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 12Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Jeżeli w miejscu listy parametrów formalnych występuje słowo kluczowe void, to oznacza, że funkcja nie posiada parametrów.

Jeżeli funkcja posiada rezultat, w ciele funkcji powinna wystąpić instrukcja return, a po niej, wyrażenie o typie zgodnym z typem rezultatu funkcji.

Na liście parametrów formalnych, dla każdego parametru określamy jego typ.

Nawiasy po nazwie funkcji są konieczne, nawet gdy funkcja nie ma parametrów. Nawiasy występują zarówno przy definicji, deklaracji jak i przy wywołaniu funkcji.

Page 13: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kilka słów na temat definiowania funkcjiKilka słów na temat definiowania funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 13Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Wersja naiwna funkcji obliczania średniego spalania:

float oblicz_spalanie( float paliwo, float dystans ){ return ( paliwo * 100 ) / dystans;}

Próba ratowania się przed dzieleniem przez zero:

float oblicz_spalanie( float paliwo, float dystans ){ if( dystans != 0 ) return ( paliwo * 100 ) / dystans;}

A jaki będzie rezultat funkcji, gdy dystans będzie równy zero?

Page 14: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kilka słów na temat definiowania funkcjiKilka słów na temat definiowania funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 14Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Specyfikacja funkcji: oblicz średnie spalanie, ignoruj ujemne wartości parametrów, gdy dystans jest zerowy, niech rezultat będzie równy -1, co jest sygnałem błędu.

float oblicz_spalanie( float paliwo, float dystans ){ if( dystans == 0 ) return –1; else return fabs( ( paliwo * 100 ) / dystans );}

. . . spalanie = oblicz_spalanie( 40.5, 0 );

if( spalanie == -1 ) cout << "Nie dokonam oblicze dla bł dnych danych";ń ęelse cout << "Spalanie wynosi " << spalanie << " l na 100 km";. . .

Page 15: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definiowanie funkcji — pułapka pierwsza, rezultat typu intDefiniowanie funkcji — pułapka pierwsza, rezultat typu intPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 15Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

W języku C/C++ wolno czasem opuścić słowo kluczowe int, wtedy zostanie ono przyjęte domyślnie. To, że tak robić można nie oznacza, że tak robić trzeba.

int fun( void ){ . . .}

fun( void ){ . . .}

Zapisy równoważne:

Page 16: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definiowanie funkcji — pułapka druga, puste nawiasy parametrówDefiniowanie funkcji — pułapka druga, puste nawiasy parametrówPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 16Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

int fun( void ){ ciało funkcji}

int fun(){ ciało funkcji}

Zapisy równoważne w C++:

Puste nawiasy parametrów w języku C i C++ oznaczają co innego.

W języku C++ puste nawiasy oznaczają brak parametrów:

W języku C puste nawiasy oznaczają zmienną liczbę parametrów:

Trzy następujące po sobie kropki ... oznaczają zmienną liczbę parametrów, jakie można przekazać funkcji.

int fun( ... ){ ciało funkcji}

int fun(){ ciało funkcji}

Zapisy równoważne w C:

Page 17: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definiowanie funkcji — zmienna liczba parametrówDefiniowanie funkcji — zmienna liczba parametrówPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 17Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Funkcja o zmiennej liczbie parametrów:

int a = 1, b = 2, c = 3, d = 4, e = 5;

cout << suma_int( 3, a, b, c ) << endl;

cout << suma_int( 2, e, c ) << endl;

cout << suma_int( 5, a, b, c, d, e ) << endl;

Funkcja printf ma zmienną liczbę parametrów:

printf( "Witaj w programie" );

printf( "Kwota podatku wynosi %g", podatek );

printf( "Podstawa opodatkowania: %g, podatek: %g", podstawa, podatek );

Page 18: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definiowanie funkcji — zmienna liczba parametrówDefiniowanie funkcji — zmienna liczba parametrówPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 18Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

int a = 1, b = 2, c = 3, d = 4, e = 5;

cout << suma_int( 3, a, b ) << endl; // Za mało parametrów

cout << suma_int( 2, e, c, a ) << endl; // Za du o parametrówż

cout << suma_int( 5, "Ala", 3.56 ) << endl; // Totalny rozjazd

printf( "Witaj w programie", podatek ); // Za du o parametrówż

printf( "Kwota podatku wynosi %g" ); // Za mało parametrów

int podstawa;printf( "Podstawa: %g", podstawa ); // Nie ten typ parametru

Kompilator nie kontroluje poprawności wywołania funkcji w części określonej zmienną liczbą parametrów.

Obsługa i kontrola poprawności wywołania funkcji ze zmienną liczbą parametrów spoczywa na programiście!

Page 19: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

void inc( int i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 19Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Co wyprowadzi program?

Page 20: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

void inc( int i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 20Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Jaki jest stan pamięci przed wywołaniem?

5a

Przed wywołanieminc( a )

5a

Page 21: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

void inc( int i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 21Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Co się dzieje w trakcie

wywołania?

5a

Przed wywołanieminc( a )

5a

Wywołanieinc( a )

5i

5a

Page 22: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

void inc( int i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 22Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Co się dzieje w trakcie

wykonania?

5a

Przed wywołanieminc( a )

5a

Wywołanieinc( a )

5i

5a

Wykonanieinc( a )

6 5Xi

5a

++i

Page 23: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

void inc( int i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 23Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Jaki jest stan pamięci po wywołaniu?

5a

Przed wywołanieminc( a )

5a

Wywołanieinc( a )

5i

5a

Wykonanieinc( a )

6 5Xi

5a 5a

Po wykonaniuinc( a )

5a

++i

Page 24: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez wartość (język C i C++)Przekazywanie parametrów przez wartość (język C i C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 24Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Przy przekazywaniu parametrów przez wartość, wartość parametru aktualnego wywołania funkcji kopiowana jest do parametru formalnego funkcji.

Od tego momentu parametr aktualny i formalny są od siebie niezależne.

Żadna modyfikacja parametru formalnego funkcji nie przenosi się na parametr aktualny wywołania.

Wnętrze funkcji nie jest w stanie zmodyfikować parametru formalnego funkcji.

Page 25: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez referencję (C++)Przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 25Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void inc( int & i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Co wyprowadzi program?

Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji

Page 26: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez referencję (C++)Przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 26Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void inc( int & i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji

Jaki jest stan pamięci przed wywołaniem?

5a

Przed wywołanieminc( a )

5a

Page 27: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez referencję (C++)Przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 27Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void inc( int & i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji

5a

Przed wywołanieminc( a )

5a

Co się dzieje w trakcie

wywołania?

5a

Wywołanieinc( a )

i

Page 28: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez referencję (C++)Przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 28Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void inc( int & i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji

5a

Przed wywołanieminc( a )

5a 5a

Wywołanieinc( a )

Co się dzieje w trakcie

wykonania?

a

Wykonanieinc( a )

i i

++i

6 5X

Page 29: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Przekazywanie parametrów przez referencję (C++)Przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 29Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void inc( int & i ){ ++i; }

. . .

int a = 5;

inc( a );

cout << a;

Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji

5a

Przed wywołanieminc( a )

5a 5a

Wywołanieinc( a )

a

Wykonanieinc( a )

i i

++i

6 5X

Jaki jest stan pamięci po wywołaniu?

5a 6a

Po wykonaniuinc( a )

Page 30: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Wykorzystanie parametrów referencyjnych (C++)Wykorzystanie parametrów referencyjnych (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 30Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Przy przekazywaniu parametrów przez referencję, parametr aktualny wywołania funkcji „nakłada” się na parametr formalny funkcji.

Od tego momentu parametr aktualny i formalny odnoszą się do tej samej lokalizacji (adresu) w pamięci operacyjnej.

Każda modyfikacja parametru formalnego funkcji przenosi się na parametr aktualny wywołania.

Wnętrze funkcji może zmodyfikować parametr formalny funkcji.

Page 31: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcja a przekazywanie parametrów przez referencję (C++)Funkcja a przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 31Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double czytajDystans(){ double liczba;

do { cout << endl << "Podaj dystans: "; cin >> liczba;

if( liczba <= 0 ) cout << "Dystans musi byc liczba dodatnia"; } while( liczba <= 0 );

return liczba;}

Wczytywanie liczby — wykorzystanie funkcji

double dystans;

dystans = czytajDystans();

Page 32: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcja a przekazywanie parametrów przez referencję (C++)Funkcja a przekazywanie parametrów przez referencję (C++)Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 32Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double czytajDystans( double & liczba ){ do { cout << endl << "Podaj dystans: "; cin >> liczba; if( liczba <= 0 ) cout << "Dystans musi byc liczba dodatnia"; } while( liczba <= 0 ); }

Wczytywanie liczby — wykorzystanie parametru referencyjnego

double dystans;

czytajDystans( dystans );

Page 33: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definicja funkcji po jej wywołaniuDefinicja funkcji po jej wywołaniuPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 33Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

int main() { double dlugosc_boku, pole; . . . pole = oblicz_pole_kwadratu( dlugosc_boku ); . . . }

double oblicz_pole_kwadratu( double bok ) { return bok * bok; }

Wywołanie funkcji

Definicja funkcji

Czy kompilatorowi

się to spodoba?

Page 34: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Czy kompilatorowi się to spodoba?Czy kompilatorowi się to spodoba?Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 34Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

int main() { double dlugosc_boku, pole; . . . pole = oblicz_pole_kwadratu( dlugosc_boku ); . . . }

double oblicz_pole_kwadratu( double bok ) { return bok * bok; }

Wywołanie funkcji

Definicja funkcji

Tak, bez błędów i ostrzeżeń — w starszych wersjach kompilatorów.

Tak, bez błędów lecz z ostrzeżeniem — w nowszych wersjach kompilatorów, oraz tych pracujących w trybie zgodności z normą ANSI.

Nie, wystąpi błąd — w kompilatorach pracujących w trybie C++.

Page 35: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Skąd te rozbieżności?Skąd te rozbieżności?Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 35Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Definicja funkcji występuje po jej wywołaniu.

Kompilator na etapie wywołania jej jeszcze nie zna.

Czyni w stosunku do niej założenia — że to funkcja, której rezultatem jest wartość int. To założenie może być słusznie albo nie.

Aby kompilator mógł kontrolować poprawność wywołania funkcji, należy to wywołanie poprzedzić definicją lub deklaracją wywoływanej funkcji.

Aby uniknąć niejednoznaczności, wprowadza się prototypy funkcji.

Deklaracja przyjmuje postać prototypu funkcji.

Page 36: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Prototypy funkcjiPrototypy funkcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 36Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

Definicja funkcji:

double oblicz_pole_kwadratu( double bok );

Deklaracja — prototyp — funkcji:

typ_rezultatu nazwa_funkcji( lista_parametrów_formalnych ){ ciało_funkcji}

Ogólna postać definicji funkcji:

typ_rezultatu nazwa_funkcji( lista_parametrów_formalnych );

Ogólna postać prototypu funkcji:

Page 37: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Wykorzystanie prototypów funkcji — zadeklaruj funkcję potem wołajWykorzystanie prototypów funkcji — zadeklaruj funkcję potem wołajPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 37Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok );

int main(){ double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; }

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

Page 38: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Można jednak po „paskalowemu” — zdefiniuj funkcje potem wołajMożna jednak po „paskalowemu” — zdefiniuj funkcje potem wołajPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 38Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#include <iostream>#include <cstdlib>using namespace std;

double oblicz_pole_kwadratu( double bok ){ return bok * bok; }

int main(){ double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; }

Page 39: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Podsumowanie informacji o prototypachPodsumowanie informacji o prototypachPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 39Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Starsze implementacje C dopuszczały wywoływanie funkcji wcześniej kompilatorowi nieznanych.

W trakcie kompilowania wywołania nieznanej funkcji przez domniemanie przyjmowano, że jej rezultatem jest wartość int i nic nie wiadomo na temat jej parametrów. Nie pozwalało to kompilatorowi kontrolować poprawności wywołania funkcji.

Aby kompilator mógł kontrolować poprawność wywołania funkcji, należy to wywołanie poprzedzić definicją lub deklaracją wywoływanej funkcji.

Deklaracja przyjmuje postać prototypu funkcji.

Deklaracja i definicja funkcji powinna być zgodna. Jeżeli w obrębie jednego pliku wystąpi niezgodność, kompilator zgłosi błąd kompilacji.

Page 40: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci autoDeklaracje zmiennych a struktura programu — klasa pamięci autoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 40Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void fun( float a ){ int i = 0; char c = 'A'; float f; if( i == 0 ) { float i = 100.0; int k; . . . }}

Przesłanianie identyfikatorów ― w obrębie tego bloku instrukcji if nazwa i oznacza, lokalną w tym bloki, zmienną typu float.

Zmienne klasy auto mogą być definiowane na początku każdego bloku w C89, w standardzie C99 i w języku C++ każdym miejscu dozwolonym syntaktyką języka.

Zmienne klasy auto pojawiają się wraz z wejściem sterowania do bloku w którym są zadeklarowane i znikają wraz z wyjściem sterowania z tego bloku.

Zmienne deklarowane wewnątrz bloku są automatycznymi, jeżeli nie podano klasy pamięci albo jawnie użyto specyfikatora auto.

Page 41: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci autoDeklaracje zmiennych a struktura programu — klasa pamięci autoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 41Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Zmienne klasy auto:

Nie zachowują swoich wartości pomiędzy swoimi kolejnymi kreacjami.

O ile nie zostaną zainicjalizowane, maja wartości przypadkowe.

Parametry formalne funkcji też są klasy auto.

void fun( float a ){ int i = 0; int j; cout << "a = " << a << " | i = " << i << " | j = " << j << endl;}

int main(){ fun( 1.0 ); fun( 2.0 ); fun( 3.0 );

return EXIT_SUCCESS;}

Page 42: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci autoDeklaracje zmiennych a struktura programu — klasa pamięci autoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 42Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Zmienna klasy auto tworzone są automatycznie i lokowane są na stosie.

Stos to element procesu, służący do przechowywania danych chwilowych.

Na stosie lokowane są zmienne auto, w tym argumenty funkcji, oraz adresy powrotu dla wywoływanych podprogramów.

Stos ma ustalony i ograniczony rozmiar ― należy sprawdzić ustalenia rozmiaru stosu w opcjach kompilatora (lub konsolidatora).

Może się zdarzyć, że stos ma rozmiar rzędu kilku kilobajtów.

Wobec powyższego, niebezpieczna może być poniższa definicja dużej tablicy:

void fun( void ){ float tab[ 10000 ]; . . .}

Page 43: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych automatycznych w obrębie instrukcjiDeklaracje zmiennych automatycznych w obrębie instrukcjiPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 43Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

W C++ można definiować zmienne w obrębie ograniczonym zasięgiem instrukcji:

for( int i = 10; i > 0; i--) cout << endl << i << "...";

i = 0; // Bł dna odwołanie poza zasi giemę ę

switch( char c = getchar() ){ case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': cout << "Samogloska " << c; break; . . . }

c = getchar(); // Bł dna odwołanie poza zasi giemę ę

Page 44: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci staticDeklaracje zmiennych a struktura programu — klasa pamięci staticPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 44Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void fun_auto(){ int i = 1; cout << endl << "Auto " << i++;}

void fun_static(){ static int i = 1; cout << endl << "Static " << i++;}

int main(){ fun_auto(); fun_static();

fun_auto(); fun_static();

fun_auto(); fun_static(); . . . }

Page 45: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci staticDeklaracje zmiennych a struktura programu — klasa pamięci staticPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 45Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Zmienne statyczne mogą być lokalne w bloku lub zewnętrzne dla wszystkich bloków.

Jeżeli zmienna wewnątrz bloku zostanie zadeklarowana ze specyfikatorem static, to:

jest raz inicjowana wartością inicjalizatora lub nadawana jest jej wartość zerowa odpowiednio do typu.

przechowuje wartość po opuszczeniu i ponownym wejściu do bloku.

Statyczne zmienne lokalne stanowią prywatną, nieulotną pamięć danej funkcji czy bloku.

Page 46: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci staticDeklaracje zmiennych a struktura programu — klasa pamięci staticPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 46Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

void funkcja_z_limitem_wywolan( void ){ static int licznik_wywolan = 0;

if( licznik_wywolan < 10 ) { licznik_wywolan++;

// Tutaj odpowiednie instrukcje } else cout << "Wersja demo -- limit wywolan wyczerpany";}

Przykład wykorzystania zmiennej statycznej — funkcja z limitem wywołań w obrę-bie pojedynczego wykonania programu:

Page 47: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci registerDeklaracje zmiennych a struktura programu — klasa pamięci registerPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 47Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Deklaracja zmiennej jako register jest równoważna z deklaracją auto, ale wskazuje że deklarowany obiekt będzie intensywnie wykorzystywany, i w miarę możliwości będzie umieszczony w rejestrze procesora.

Jeżeli nie jest możliwe umieszczenie zmiennej w rejestrze, pozostaje ona w pamięci.

Zmienne rejestrowe pozwalają zredukować zajętość pamięci i poprawić szybkość wykonania operacji takie zmienne wykorzystujących.

Jednak większość współczesnych kompilatorów wykorzystuje optymalizację rejestrową, zatem wiele zmiennych i tak przechowywanych jest w rejestrach, mimo braku jawnej specyfikacji jako register.

register int i;for( i = 0; i < 10; i++ ){ . . .}

int very_time_critical_fun( register int i ){ . . .}

Page 48: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci externDeklaracje zmiennych a struktura programu — klasa pamięci externPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 48Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double dystans, paliwo;

void czytaj_dane(){ . . . cin >> dystans; . . . cin >> paliwo;}

void pisz_wyniki(){ if( dystans == 0 ) cout << "Nie policze spalania dla zerowego dystansu" ); else cout << "Spalanie " << ( paliwo * 100 ) / dystans << "l na 100 km" ;}

int main(){ . . . czytaj_dane(); pisz_wyniki(); return EXIT_SUCCESS;}

Page 49: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracje zmiennych a struktura programu — klasa pamięci externDeklaracje zmiennych a struktura programu — klasa pamięci externPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 49Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Zmienne zewnętrzne deklarowane są na zewnątrz wszystkich funkcji. Zasięg zmiennej zewnętrznej rozciąga się od miejsca deklaracji do końca pliku.

Zmienne zewnętrzne istnieją stale, nie pojawiają się i nie znikają, zachowują swoje wartości i są dostępne dla wszystkich funkcji programy występujących w zakresie danej zmiennej.

Zmienna zewnętrzna jest raz inicjowana wartością inicjalizatora lub nadawana jest jej wartość zerowa odpowiednio do typu.

Jeżeli dla zmiennej zewnętrznej użyjemy specyfikacji static, to oznacza to uprywatnienie (ograniczenie dostępu) w obrębie danego pliku źródłowego.

Zmienne zewnętrzne oraz ich właściwe definiowanie i deklarowanie mają istotne znaczenie przy organizacji programów wielomodułowych.

Page 50: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definicje zmiennych o ustalonej wartościDefinicje zmiennych o ustalonej wartościPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 50Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Słowo kluczowe const oznacza modyfikator często używany w C++, dostępny jest również — choć rzadziej używany — w języku C.

Modyfikator const użyty w definicji zmiennej lub parametru oznacza, że wartość takiego elementu nie może być zmieniana po zainicjowaniu.

const int i = 1;...i = 5; // Niedozwolone

void print_int( const int & i ){ cout << i;}

void inc( const int & i ){ ++i; // Nie wolno! }

Aby wnętrze funkcji nie mogło zmodyfikować parametru aktualnego:

Mimo, że modyfikator const występuje w C i C++ występują pewne różnice w możli-wości jego wykorzystania, co zostanie omówione później.

Page 51: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Definicje zmiennych o nieprzewidywalnie zmiennej wartościDefinicje zmiennych o nieprzewidywalnie zmiennej wartościPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 51Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Słowo kluczowe volatile to modyfikator oznaczający obiekt o wartościach zmieniających się w nieprzewidywalny sposób, inaczej obiekty ulotne.

Obiektami takimi mogą być zmienne odnoszące się do obiektów zewnętrznych w stosunku do programu — zmiennych nałożonych na porty We/Wy, odnoszących się do obszarów BIOS'a, systemu operacyjnego.

Takie zmienne nie powinny być poddawane optymalizacjom ― szczególnie optymalizacji rejestrowej. Specyfikacja volatile zapobiega wszystkim potencjalnym optymalizacjom.

volatile unsigned char kbdState = ... ; // Zmienna nało ona na dane BIOSż

while( kbdState & LR_SHIFT ){ if( kbdState & L_SHIFT ) // co tam. . .ś if( kbdState & R_SHIFT ) // co tam. . .ś . . .}

Ponieważ zmienna kbdState jest z iteracji while często wykorzystywana, kompilator może „przenieść” ją do rejestru procesora.

Sprawi to, że ten fragment programu nie będzie działał poprawnie.

Page 52: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym moduleFunkcje w osobnym modulePodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 52Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Funkcje o podobnym przeznaczeniu mogą być grupowane w moduły.

Języki C i C++ nie oferują zdefiniowanej syntaktycznie modularyzacji.

Jednak program może się składać z kompilowanych oddzielnie części — zwanych właśnie modułami — łączonych potem przez konsolidator (wraz z bibliotekami) w plik wykonywalny.

Przyjęta konwencja budowania modułów zakłada oddzielenie części publicznej (nagłówkowej) modułu od części implementacyjnej (realizacyjnej).

Część implementacyjna modułu

Tutaj kod oraz deklaracje składowych modułu, również prywatnych (wewnętrznych)

Część nagłówkowa modułu

Tutaj deklaracje elementów eksportowanych przez moduł — to moduł udostępnia.

Plik nagłówkowy, rozszerzenia: .h, .hpp, .hxx

Plik realizacyjny, rozszerzenia: .c, .cpp, .cxx

Moduł

Page 53: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Część publiczna a cześć implementacyjnaCzęść publiczna a cześć implementacyjnaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 53Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Część publiczna modułu zawiera opis elementów dostępnych do użytku w innych modułach programu.

W językach C i C++ część publiczna modułu to osobny plik — plik nagłówkowy (rozszerzenie h, hpp, hxx).

Plik nagłówkowy jest plikiem tekstowym, udostępniany jest i dystrybuowany w wersji tekstu jawnego.

Część implementacyjna modułu zawiera wszystko to, co potrzebne jest dla działania elementów udostępnianych przez moduł.

W językach C i C++ część implementacyjna modułu to osobny plik — zwykły plik programu (rozszerzenie c, cpp, cxx).

Część implementacyjna może być udostępniana i dystrybuowana w postaci źródłowej lub skompilowanej (pliki o, obj, lib).

Page 54: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — przykładFunkcje w osobnym module — przykładPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 54Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Załóżmy, że chcemy stworzyć moduł o nawie fun, w którym będą zdefiniowane funkcje obliczające pola i obwody figur płaskich.

Zaczniemy od modułu udostępniającego następujące funkcje:

double pole_kwadratu( double bok );

double obwod_kwadratu( double bok );

double pole_kola( double promien );

double obwod_kola( double promien );

Inne moduły programu będą mogły wykorzystywać funkcje zdefiniowane w module fun.

Page 55: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — koncepcjaFunkcje w osobnym module — koncepcjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 55Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

int main(){ . . . cout << pole_kwadratu( 10 ) << endl; cout << obwod_kwadratu( 10 ) << endl; cout << pole_kola( 10 ) << endl; cout << obwod_kola( 10 ) << endl; . . . return EXIT_SUCCESS;}

double pole_kwadratu( double bok ){ return bok * bok;}

double obwod_kwadratu( double bok ){ return 4 * bok;}

double pole_kola( double promien ){ return 3.14 * promien * promien;}

double obwod_kola( double promien ){ return 2 * 3.14 * promien;}

Program główny: main.cpp Moduł z funkcjami: fun

Wywołania funkcji udostępnianychprzez moduł fun

Definicje funkcji udostępnianychprzez moduł fun

Page 56: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — podział modułu na częściFunkcje w osobnym module — podział modułu na częściPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 56Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double pole_kwadratu( double bok ){ return bok * bok;}

double obwod_kwadratu( double bok ){ return 4 * bok;}

double pole_kola( double promien ){ return M_PI * promien * promien;}

double obwod_kola( double promien ){ return 2 * M_PI * promien;}

Moduł z funkcjami: fun

Definicje funkcji udostępnianychprzez moduł fun

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

double pole_kwadratu( double bok ){ return bok * bok;}

double obwod_kwadratu( double bok ){ return 4 * bok;}

double pole_kola( double promien ){ return 3.14 * promien * promien;}

double obwod_kola( double promien ){ return 2 * 3.14 * promien;}

Część publiczna modułu: fun.hpp

Część implementacyjna : fun.cpp

Page 57: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — włączanie własnego pliku nagłówkowegoFunkcje w osobnym module — włączanie własnego pliku nagłówkowegoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 57Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

#include "fun.hpp"

double pole_kwadratu( double bok ){ return bok * bok;}

double obwod_kwadratu( double bok ){ return 4 * bok;}

double pole_kola( double promien ){ return 3.14 * promien * promien;}

double obwod_kola( double promien ){ return 2 * 3.14 * promien;}

Część publiczna modułu: fun.hpp

Część implementacyjna : fun.cpp

Moduły zwykle włączają własny plik nagłówkowy.W tym akurat przypadku nie jest to konieczne.

Page 58: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — włączanie innych plików nagłówkowychFunkcje w osobnym module — włączanie innych plików nagłówkowychPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 58Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#include "fun.hpp"

#include <cmath>

double pole_kwadratu( double bok ){ return bok * bok;}

double obwod_kwadratu( double bok ){ return 4 * bok;}

double pole_kola( double promien ){ return M_PI * promien * promien;}

double obwod_kola( double promien ){ return 2 * M_PI * promien;}

Część implementacyjna : fun.cpp

Włączenie pliku nagłówkowego zawierającego definicję stałej π : M_PI

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

Część publiczna modułu: fun.hpp

Page 59: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — włączanie innych plików nagłówkowychFunkcje w osobnym module — włączanie innych plików nagłówkowychPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 59Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Próba włączenia pliku wiele razy:

Prototypy funkcji zostaną włączone jeden raz

#ifndef _fun_hpp_#define _fun_hpp_

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

#endif

Część publiczna modułu: fun.hpp

#include <iostream>#include <cstdlib>#include "fun.hpp"...#include "fun.hpp"...#include "fun.hpp"

Dyrektywa umożliwiającakompilację warunkową

Page 60: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Funkcje w osobnym module — wykorzystanie pliku nagłówkowegoFunkcje w osobnym module — wykorzystanie pliku nagłówkowegoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 60Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#include <iostream>#include <cstdlib>int main(){ . . . cout << pole_kwadratu( 10 ) << endl; cout << obwod_kwadratu( 10 ) << endl; cout << pole_kola( 10 ) << endl; cout << obwod_kola( 10 ) << endl; . . . return EXIT_SUCCESS;}

Program główny: main.cpp

Ostrzeżenie lub błąd kompilacji — definicje(prototypy) tych funkcji nie są znane!

#include <iostream>#include <cstdlib>#include "fun.hpp"int main(){ . . . cout << pole_kwadratu( 10 ) << endl; cout << obwod_kwadratu( 10 ) << endl; cout << pole_kola( 10 ) << endl; cout << obwod_kola( 10 ) << endl; . . . return EXIT_SUCCESS;}

Program główny: main.cpp

Po włączeniu pliku nagłówkowego fun.hppdeklaracje tych funkcji są znane kompilatorowi

Program w włączonym plikiem nagłówkowym skompiluje się poprawnie, ale nie powstanie wersja wykonywalna, ponieważ program jest jeszcze niekompletny... .

Page 61: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilator, konsolidator... przypomnienieKompilator, konsolidator... przypomnieniePodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 61Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Programźródłowy

EdytorŚrodowisko do tworzenia

programu źródłowego

Plik (pliki) tekstowe, np.: - Pascal : .pas - C : .c - C++ : .cpp, cxx

Analizatorsyntaktyczny

Generator kodumaszynowego

K o m p i l a t o rKonsolidator

(ang. linker)

Błędysyntaktyczne(składniowe)

Błędykonsolidacjiprogramu

Kod maszynowyprzed konsolidacją

Plik (pliki) object .: - Dos, Windows : .obj, .tpu - Unix : .o

Kod wykonywalny Plik wykonywalny : - Dos, Windows : .com, .exe - Unix : .out

Biblioteki standardowe,systemowe, specjalizowane

Środowiskouruchomieniowe

(ang. debuger, profiler)Testowanie i uruchamianie

Błędywykonaniaprogramu

PoprawkiModyfikacjeRozwój

Wdrożenieprogramu

Page 62: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja + konsolidacja dla pojedynczego modułuKompilacja + konsolidacja dla pojedynczego modułuPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 62Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Wersja źródłowa

Realizacja dyrektyw, w tym #include

Kompilacja, generacja kodu maszynowego

Dołączenie kodu z bibliotek standardowych i innych zewnętrznych

Program wykonywalny

Kod maszynowy, jeszcze nie gotowydo uruchomienia

Plik tekstowy po rozwinięciu dyrektywpreprocesora

fun.hpp

cstdlib

iostream

Pliki bibliotek

Page 63: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja + konsolidacja dla programu wielomodułowego — problemKompilacja + konsolidacja dla programu wielomodułowego — problemPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 63Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Wersja źródłowa

Realizacja dyrektyw, w tym #include

Kompilacja, generacja kodu maszynowego

Dołączenie kodu z bibliotek standardowych i innych zewnętrznych

Program wykonywalny

Kod maszynowy, jeszcze nie gotowydo uruchomienia

Plik tekstowy po rozwinięciu dyrektywpreprocesora

fun.hpp

cstdlib

iostream

Pliki bibliotek

Te etapy przebiegają podobniedo kompilacji programu jednomodułowego

Page 64: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja + konsolidacja dla programu wielomodułowego — problemKompilacja + konsolidacja dla programu wielomodułowego — problemPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 64Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Wersja źródłowa

Realizacja dyrektyw, w tym #include

Kompilacja, generacja kodu maszynowego

Dołączenie kodu z bibliotek standardowych i innych zewnętrznych

Program wykonywalny

Kod maszynowy, jeszcze nie gotowydo uruchomienia

Plik tekstowy po rozwinięciu dyrektywpreprocesora

fun.hpp

cstdlib

iostream

Pliki bibliotek

Skąd konsolidator ma wiedzieć,że funkcje są w fun.cpp?

Page 65: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — koncepcjaKompilacja rozłączna — koncepcjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 65Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Dołączenie kodu z bibliotek standardowych i modułu fun.cpp

Program wykonywalny

fun.hpp

cstdlib

iostream

Pliki bibliotek

fun.cpp

Preprocesor

Kompilator

fun.cpp popreprocesingu

fun.o

Kompilacjaprogramugłównegomain.cpp

fun.hpp

Page 66: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — koncepcjaKompilacja rozłączna — koncepcjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 66Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Dołączenie kodu z bibliotek standardowych i modułu fun.cpp

Program wykonywalny

fun.hpp

cstdlib

iostream

Pliki bibliotek

fun.cpp

Preprocesor

Kompilator

fun.cpp popreprocesingu

fun.o

fun.hpp

Kompilacjamodułufun.cpp

Page 67: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — koncepcjaKompilacja rozłączna — koncepcjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 67Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

main.cpp

Preprocesor

Kompilator

main.cpp popreprocesingu

main.o

Konsolidator

main.exe

Dołączenie kodu z bibliotek standardowych i modułu fun.o

Program wykonywalny

fun.hpp

cstdlib

iostream

Pliki bibliotek

fun.cpp

Preprocesor

Kompilator

fun.cpp popreprocesingu

fun.o Kod maszynowyfunkcji

Kod maszynowyprogramu głównego

fun.hpp

Page 68: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — manualne zarządzanie kompilacjąKompilacja rozłączna — manualne zarządzanie kompilacjąPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 68Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Wywołanie to spowoduje:kompilacje programu test.cpp,wygenerowanie pliku pośredniego test.o (w przypadku braku błędów),połączenie test.o z plikami bibliotek i generacja i wynikowego pliku a.out.

Załóżmy, że kompilator dostępny jest poleceniem cc (jak w systemach Unixowych)i zmienne środowiskowe są ustalone.

cc test.cpp

Użycie flagi -o umożliwia określenie nazwy pliku wynikowego (np. uruchom).

cc test.cpp –o uruchom

Użycie flagi -c pozwala na samą kompilację (bez konsolidacji programu).

cc -c test.cppPowstaje tylko plik pośredni test.o.

Page 69: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — manualne zarządzanie kompilacjąKompilacja rozłączna — manualne zarządzanie kompilacjąPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 69Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Załóżmy, że nasz program składa się z modułów:main.cpp — program główny z funkcją main,fun.cpp — moduł z definicjami funkcji.

Kompilujemy oddzielnie poszczególne moduły:

cc fun.o main.o –o uruchom

W przypadku modyfikacji pliku fun.cpp wystarczy:

cc -c main.cpp

Powstają pliki pośrednie main.o oraz fun.o. Łączymy je w program wykonywalny o nazwie uruchom:

cc -c fun.cpp

cc -c fun.cppcc fun.o main.o –o uruchom

Page 70: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — automatyzacjaKompilacja rozłączna — automatyzacjaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 70Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

make — program realizujący niezbędne kompilacje w oparciu o reguły zdefiniowane w pliku sterującym (domyślna nazwa — Makefile):

plik ten opisuje zależności pomiędzy modułami programu oraz określa jaki wywołania powinny zostać wykonane dla każdego z modułów,program make sprawdza czasy modyfikacji plików źródłowych i docelowych i przeprowadza jedynie niezbędne kompilacje.

Makefile dla omawianego przykładu:

uruchom : fun.o main.occ fun.o main.o –o uruchom

fun.o : fun.cpp fun.hppcc -c fun.cpp

main.o : main.cpp fun.hppcc -c main.cpp

Page 71: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — tworzenie projektów w środowiskach IDEKompilacja rozłączna — tworzenie projektów w środowiskach IDEPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 71Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Większość środowisk programistycznych oferuje możliwość budowania projektów. Projekt określa przynajmniej:

pliki źródłowe i pomocnicze wchodzące w skład programu,lokalizację bibliotek, plików nagłówkowych,opcje kompilacji, typ kodu wynikowego,oraz inne, zależne od implementacji, cechy i parametry programu.

Page 72: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — tworzenie projektów w Code::BlocksKompilacja rozłączna — tworzenie projektów w Code::BlocksPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 72Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Page 73: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Kompilacja rozłączna — tworzenie projektów w Dev-C++Kompilacja rozłączna — tworzenie projektów w Dev-C++Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 73Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Page 74: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Co może eksportować moduł?Co może eksportować moduł?Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 74Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#define KEY_UP 0x48#define KEY_DOWN 0x50#define KEY_LEFT 0x4b#define KEY_RIGHT 0x4d

Stałe, jako symbole preprocesoraStałe, jako symbole preprocesora:

enum ctrl_key_codes{ KEY_UP = 0x48, KEY_DOWN = 0x50, KEY_LEFT = 0x4b, KEY_RIGHT = 0x4d};

Typy wyliczeniowe:

typedef unsigned char byte;typedef unsigned short int word;typedef unsigned long int counter_t;

Nazwy typów zdefiniowanych przez programistę:

Page 75: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Co może eksportować moduł? cd... .Co może eksportować moduł? cd... .Podstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 75Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

const int MAKS_PREDK_ZABUD = 50;const double MOJE_PI = 3.14;

Definicje zmiennych const:

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

Prototypy funkcji:

Uwaga, jeżeli moduł eksportuje definicje typów czy stałych, zwykle trzeba zabezpieczać plik nagłówkowy przed wielokrotnym włączaniem w tym samym zakresie.

Page 76: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Zabezpieczenie przed wielokrotnym włączaniem pliku nagłówkowegoZabezpieczenie przed wielokrotnym włączaniem pliku nagłówkowegoPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 76Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

#ifndef _fun_hpp_#define _fun_hpp_

const double MOJE_PI = 3.14;

double pole_kwadratu( double bok );. . .#endif

#include "fun.hpp"..#include "fun.hpp"..#include "fun.hpp"

const double MOJE_PI = 3.14;

double pole_kwadratu( double bok );. . .

#include "fun.hpp"..#include "fun.hpp"..#include "fun.hpp"

Dyrektywa kompilacji warunkowej:

Gdyby nie było tej dyrektywy:

Page 77: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Deklaracja zmiennej — informacja o typie i nazwie zmiennej, nie musi zawierać informacji o klasie pamięci i wartości incjalizującej.

Definicja zmiennej — to deklaracja zawierająca informacje o klasie pamięci i wartości inicjalizującej.

Eksport zmiennej zewnętrznejEksport zmiennej zewnętrznejPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 77Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Uwaga, jeżeli moduł ma eksportować zmienną, należy w odpowiedni sposób to opisać.

Definicja zmiennej występuje raz i rezerwuje pamięć dla zmiennej, zgodna z definicją deklaracja może występować w programie wiele razy, ma charakter informacyjny.

Page 78: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Eksport zmiennej zewnętrznejEksport zmiennej zewnętrznejPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 78Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

extern int input_data_error;

Plik nagłówkowy zawiera deklarację zmiennej:

int input_data_error;

Plik implementacyjny zawiera definicję zmiennej:

#ifndef _fun_hpp_#define _fun_hpp_

extern int input_data_error;

double pole_kwadratu( double bok );double obwod_kwadratu( double bok );double pole_kola( double promien );double obwod_kola( double promien );

#endif

#include "fun.hpp"#include <cmath>

int input_data_error;

double pole_kwadratu( double bok ){ return bok * bok;}

. . .

Page 79: Podstawy programowania w języku C i C++prac.us.edu.pl/~siminski/c_cxx/c_cxx_w05.pdf · w języku C i C++ Funkcje i struktura programu Część piąta Niniejsze opracowanie zawiera

Każda funkcja i zmienna zewnętrzna jest domyślnie eksportowanaKażda funkcja i zmienna zewnętrzna jest domyślnie eksportowanaPodstawy programowania w C++Podstawy programowania w C++

Copyright © Roman Simiński 79Strona :

Funkc je i s t ruk tu ra p r og ram uFunkc je i s t ruk tu ra p r og ram u

Każda funkcja i zmienna zewnętrzna występująca w module może być dostępna dla innych modułów programu. Czasem chcemy jednak ograniczyć dostęp do takich zmiennych i funkcji — uprywatnić je w obrębie modułu.

static int private_error_flag;. . .static void private_error_handler( void ){ . . .}

Jeżeli definicja zmiennej zewnętrznej lub funkcji zawiera słowo static, nie są one dostępne dla innych modułów programu:

Nazwy takich zmiennych i funkcji mogą się powtarzać w innych modułach programu.