Funkcja, argumenty funkcji

Podobne dokumenty
typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Języki i metodyka programowania. Wskaźniki i tablice.

IX. Wskaźniki.(3 godz.)

Struktury. Przykład W8_1

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Język C++ zajęcia nr 2

Informatyka I: Instrukcja 4.2

Stałe i zmienne znakowe. Stała znakowa: znak

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Tablice, funkcje - wprowadzenie

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Laboratorium nr 10. Temat: Funkcje cz.2.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Wskaźniki w C. Anna Gogolińska

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Wykład 4: Klasy i Metody

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Język C, tablice i funkcje (laboratorium, EE1-DI)

Przekazywanie argumentów wskaźniki

Tablice, funkcje, wskaźniki - wprowadzenie

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Język C, tablice i funkcje (laboratorium)

KURS C/C++ WYKŁAD 6. Wskaźniki

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Funkcja (podprogram) void

DYNAMICZNE PRZYDZIELANIE PAMIECI

Wstęp do Programowania, laboratorium 02

Wstęp do wskaźników w języku ANSI C

Wstęp. do języka C na procesor (kompilator RC51)

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

Lab 9 Podstawy Programowania

Pliki. Informacje ogólne. Obsługa plików w języku C

Język C zajęcia nr 11. Funkcje

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Zmienne, stałe i operatory

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

TEMAT : KLASY DZIEDZICZENIE

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Stałe, tablice dynamiczne i wielowymiarowe

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Wstęp do informatyki- wykład 11 Funkcje

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Wstęp do informatyki- wykład 9 Funkcje

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Przeciążenie operatorów

Programowanie komputerowe. Zajęcia 4

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Techniki Programowania wskaźniki

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie 2. Język C++. Wykład 2.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

1 Podstawy c++ w pigułce.

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Podstawy programowania komputerów

Wstęp do programowania

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Techniki Programowania wskaźniki 2

Podstawy programowania w języku C++

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Języki i techniki programowania Ćwiczenia 2

6 Przygotował: mgr inż. Maciej Lasota

Transkrypt:

Funkcja, argumenty funkcji Funkcja to jest część programu, która ma swoje imię, może być wywołaną z drugiej części programu tyle razy, ile to jest koniecznie. Przykład: funkcja power podnosi liczbę rzeczywistą x w stopień całkowitą n: double power(double base, int n); // to jest deklaracja funkcji //definicja (implementacja) funkcji double power(double base, int n) int i; double res = 1.0; for(i=1; i<=n; i++) res = res * base; return res;

Wywołanie funkcji (W_1): double power(double base, int n); //deklaracja funkcji (prototyp) int main() int pow = 15; double a = 35.0; double res = 0.0; res = power(a, pow); //wywołanie funkcji res = a**pow; printf( a = %le pow = %d a**pow = %le\n, a, pow, res); return 0; //definicja funkcji double power(double base, int n) //ciało funkcji

Przypomnimy: Definicja funkcji: typ nazwa_funkcji (lista deklaracji argumentów)...ciało (treść) funkcji return val; //zwraca znaczenie typu typ Parametr (argument formalny, parametr formalny) to jest zmienna z listy parametrów w definicji funkcji Argument (argument faktyczny, parametr faktyczny) to jest znaczenie przy wywołani funkcji (to, co my podstawiamy) Ma być pełną odpowiedniość pomiędzy typami argumentów formalnych w definicji funkcji, deklaracji funkcji i typami argumentów faktycznych.

Funkcja może nie zwracać żadnego znaczenia. void nazwa_funkcji(lista deklaracji argumentów)...coś tam... return; //nie koniecznie Uwaga! Może powstać taka sytuacja: void nazwa_funkcji(lista deklaracji argumentów)...coś tam... if(wyrażenie_logiczne) return;... kontynuujemy instrukcje funkcji... return; //nie koniecznie

Może być tak, że funkcja zwraca jakieś znaczenie, przecież funkcja, która wywołuje, może ignorować to znaczenie. Przykład: printf(...); W C wszyscy argumenty funkcji są przekazane po znaczeniu. To oznacza, że przy wywołaniu funkcji jest tworzona w steku kopia argumentów faktycznych. Sama funkcja ma dostęp do kopii argumentów faktycznych. Więc przy zakończeni jej działalności ten stek, czyli kopii argumentów faktycznych, będą zniszczone. Wszystkie zmiany, które byli wykonane nad znaczeniami kopii zmiennych argumentów faktycznych, będą stracone.

Przykład: void fun_1(int k); int main() int i=10; fun_1(i); printf( i= %d\n, i); //i=10 return 0; void fun_1(int k) k=20;

Przykład _1 (debug śledzić za zmienną i ) Istnieje możliwość napisać kod tak, żeby funkcja była w stanie zmienić znaczenie argumentów faktycznych. Dla tego koniecznie jest przekazanie nie samych argumentów, a ich adresów w pamięci - wskaźników do argumentów. Istnieje jeszcze jedną możliwość, żeby funkcja mogła by zmieniać znaczenia argumentów faktycznych. To jest wywołanie po referencji na argument. Przekazanie argumentów przez wskaźniki. Wskaźnik do zmiennej A to jest inna zmienna ptra (4 B/8 B) (4 B platforma ia32, 8 B x64), znaczenie której wskazuje na adres zmiennej A w pamięci komputera, czyli na adres jej pierwszego bajta. Znaczenie wskaźnika liczba szesnastkowa.

Operacja pobrania adresu: double a; //definicja zmiennej typu double rezerwacja 8 bajtów pamięci double *b; //definicja wskaźnika do zmiennej typu double; rezerwacja 4 B; // ten wskaźnik teraz nie jest wyznaczony b = &a; //przypisanie zmiennej typu double * (wskaźnik do typu double) //adresu zmiennej a; teraz zmienna b jest wyznaczona; //na przykład, b = 0x0012cbe size_t len; len = sizeof(a); //len = 8 B len = sizeof(b); //len = 4 B dla systemów operacyjnych 32-cyfrowych

Operacja dostępu do danych po adresu (operator wskazania pośredniego): double a = 3.14; double *b = NULL; //b = 0x0000000; double c = 0.0; //inicjalizacja: c = 0.0 b = &a; //b = 0x0064ff12 c = *b; // c = 3.14; *b to jest operator wskazania pośredniego *b += a; // *b L-value; *b = *b+a; Pod adresem b teraz jest //zmienna o wartości 6.28; c = *b; // c = 6.28; printf( a = %le\n, a); // wydruk: a = 6.280000e+00; W tym przykładzie zmienili my wartość zmiennej a, operując jej adresem.

//prototyp void fun_1(int k);... //wywołanie po //znaczeniu fun_1(i); //znacz. i nie zmieniło //się... //definicja funkcji void fun_1(int k) k = 10*k; Przykłady napisania funkcji //prototyp void fun_2(int *k);... //wywołanie po //wskaźniku fun_2(&i); // znacz. i zmieniło się... //definicja funkcji void fun_2(int *k) *k = 10*(*k); //prototyp void fun_3(int &k);... //wywołanie po //referencji fun_3(i); // znacz. i zmieniło się... //definicja funkcji void fun_3(int &k) k = 10*k;

Przy wywołaniu funkcji fun_1 będzie stworzona kopia argumentu w steku, i funkcja zmieni wartość lokalnej zmiennej k, czyli wartość kopii. Przy wyjściu z funkcji stek będzie zniszczony, a wartość zmiennej i w funkcji main pozostanie bez zmiany. main: adres i: &i 0x0012ff68 fun_1: kopia zmiennej i o nazwie k adres k: 0x0012fe20 1 B 1 B 1 B 1 B W tych adresach pamięci jest zmienna int i 1 B 1 B 1 B 1 B W tych adresach pamięci jest zmienna int k kopia zmiennej i

Przy wywołaniu funkcji fun_2 również będzie stworzona kopia argumentu w steku, tylko w tym wypadku faktycznym argumentem jest wskaźnik na zmienne typu int. Więc będzie stworzona kopia wskaźnika. I wskaźnik, i jego kopia, wskazują na ten samy adres w pamięci, więc na pierwszy bajt zmiennej i (przykład ww3_1 pod debugerem) main: adres i: &i 0x0012ff68 fun_2: kopia wskaźnika na i o nazwie k ma adres: &k=0x0012ff10, wskazuje na Adres pierwszego bajta zmiennej i - 0x0012ff68 1 B 1 B 1 B 1 B W tych adresach pamięci jest zmienna int i

Trzeci sposób to jest przekazanie argumentów po referencji na zmienne. Faktycznie to jest skryty sposób przekazania po wskaźniku. Różni się od drugiego kształtem zapisu. Wielu programistów sądzą, że to jest bardziej elegancki sposób wobec drugiego, dla tego że nie musimy używać operatorów typu *ptr.... Przecież to jest sprawa przyzwyczajenia.

Przykład ww3_2 see listing

Wykonanie programu Po definicji zmiennych ID (nazwa zm.) typu double (8 B) Adres (4 B) wartość Znaczenie danych w pamięci, na którą wskazuje ptr1 r 0x0018ff28 0.0 - area 0x0018ff18 0.0 - circuit 0x0018ff08 0.0 - ptr1 0x0018fefc 0x00000000 Nie wyznaczone

Wykonanie programu Po wczytaniu r ID (nazwa zm.) typu double (8 B) Adres (4 B) wartość Znaczenie danych w pamięci, na którą wskazuje ptr1 r 0x0018ff28 2.0 - area 0x0018ff18 0.0 - circuit 0x0018ff08 0.0 - ptr1 0x0018fefc 0x0018ff18 0.0

Wykonanie programu Po wejściu w funkcje kolo() ID (nazwa zm.) typu double (8 B) Adres (4 B) wartość Znaczenie danych w pamięci, na którą wskazują S, L r 0x0018fe0c 2.0 - S 0x0018fe04 0x0018ff18 0.0 L 0x0018fe08 0x0018ff08 0.0 Kopie w steku Wartości przekazane Przekazanie pierwszego argumantu po znaczeniu, drugiego i dalej -po wskażniku

Wykonanie programu Przed wyjściem z funkcji kolo() ID (nazwa zm.) typu double (8 B) Adres (4 B) wartość Znaczenie danych w pamięci, na którą wskazuje S, L r 0x0018fe0c 2.0 - S 0x0018fe04 0x0018ff18 12.566371 L 0x0018fe08 0x0018ff08 12.566371

Wykonanie programu Po wyjściu z funkcji kolo() ID (nazwa zm.) typu double (8 B) Adres (4 B) wartość Znaczenie danych w pamięci, na którą wskazuje ptr1 r 0x0018ff28 2.0 - area 0x0018ff18 12.566371 - circuit 0x0018ff08 12.566371 - ptr1 0x0018fefc 0x0018ff18 12.566371