BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 16 | UU: 518

Procedury i funkcje

Pierwszy napisany przez nas program składał się wyłącznie z jednej funkcji main() . W praktyce takie sytuacje w ogóle się nie zdarzają, a kod aplikacji zawiera najczęściej bardzo wiele procedur i funkcji. Poznamy zatem dogłębnie istotę tych konstrukcji, by móc pisać prawdziwe programy.

Procedura lub funkcja to fragment kodu, który jest wpisywany raz, ale może być wykonywany wielokrotnie. Realizuje on najczęściej jakąś pojedynczą czynność przy użyciu ustalonego przez programistę algorytmu. Jak wiemy, działanie wielu algorytmów składa się na pracę całego programu, możemy więc powiedzieć, że procedury i funkcje są podprogramami , których cząstkowa praca przyczynia się do funkcjonowania programu jako całości.

Gdy mamy już (a mamy? :D) pełną jasność, czym są podprogramy i rozumiemy ich rolę, wyjaśnijmy sobie różnicę między procedurą a funkcją.

Procedura to wydzielony fragment kodu programu, którego zadaniem jest wykonywanie jakiejś czynności.

 

Funkcja zawiera kod, którego celem jest obliczenie i zwrócenie jakiejś wartości 1 .

Procedura może przeprowadzać działania takie jak odczytywanie czy zapisywanie pliku, wypisywanie tekstu czy rysowanie na ekranie. Funkcja natomiast może policzyć ilość wszystkich znaków 'a' w danym pliku czy też wyznaczyć najmniejszą liczbę spośród wielu podanych.

W praktyce (i w języku C++) różnica między procedurą a funkcją jest dosyć subtelna, dlatego często obie te konstrukcje nazywa się dla uproszczenia funkcjami. A ponieważ lubimy wszelką prostotę, też będziemy tak czynić :)

Własne funkcje

Na początek dokonamy prostej modyfikacji programu napisanego wcześniej. Jego kod będzie teraz wyglądał tak:

// Functions - przykład własnych funkcji
#include <iostream>
#include <conio.h>
void PokazTekst()
{
std::cout << "Umiem juz pisac wlasne funkcje! :)" << std::endl;
}
void main()
{
PokazTekst();
getch();
}

Po kompilacji i uruchomieniu programu nie widać większych zmian - nadal pokazuje on komunikat w oknie konsoli (oczywiście o innej treści, ale to raczej średnio ważne :)). Jednak wyraźnie widać, że kod uległ poważnym zmianom. Na czym one polegają?

Otóż wydzieliliśmy fragment odpowiedzialny za wypisywanie tekstu do osobnej funkcji o nazwie PokazTekst() . Jest ona teraz wywoływana przez naszą główną funkcję, main() .

Zmianie uległ więc sposób działania programu - rozpoczyna się od funkcji main() , ale od razu "przeskakuje" do PokazTekst() . Po jej zakończeniu ponownie wykonywana jest funkcja main() , która z kolei wywołuje funkcję getch() . Czeka ona na wciśnięcie dowolnego klawisza i gdy to nastąpi, wraca do main() , której jedynym zadaniem jest teraz zakończenie programu.

Tryb śledzenia

Przekonajmy się, czy to faktycznie prawda! W tym celu uruchomimy nasz program w specjalnym trybie krokowym . Aby to uczynić wystarczy wybrać z menu opcję Debug|Step Into lub Debug|Step Over , ewentualnie wcisnąć F11 lub F10.

Zamiast konsoli z wypisanym komunikatem widzimy nadal okno kodu z żółtą strzałką, wskazującą nawias otwierający funkcję main() . Jest to aktualny punkt wykonania (ang. execution point ) programu, czyli bieżąco wykonywana instrukcja kodu - tutaj początek funkcji main() .

Wciśnięcie F10 lub F11 spowoduje "wejście" w ową funkcję i sprawi, że strzałka spocznie teraz na linijce

PokazTekst();

Jest to wywołanie naszej własnej funkcji PokazTekst() . Chcemy dokładnie prześledzić jej przebieg, dlatego wciśniemy F11 (lub skorzystamy z menu Debug|Step Into ), by skierować się do jej wnętrza. Użycie klawisza F10 (albo Debug|Step Over ) spowodowałoby ominięcie owej funkcji i przejście od razu do następnej linijki w main() . Oczywiście mija się to z naszym zamysłem i dlatego skorzystamy z F11.

Punkt wykonania osiadł obecnie na początku funkcji PokazTekst() , więc korzystając z któregoś z dwóch używanych ostatnio klawiszy możemy umieścić go w jej kodzie. Dokładniej, w pierwszej linijce

std::cout << "Umiem juz pisac wlasne funkcje! :)" << std::endl;

Jak wiemy, wypisuje ona tekst do okna konsoli. W tym momencie użyj Alt+Tab lub jakiegoś innego windowsowego sposobu, by przełączyć się do niego. Przekonasz się (czarno na czarnym ;)), iż jest całkowicie puste. Wróć więc do okna kodu, wciśnij F10/F11 i ponownie spójrz na konsolę. Zobaczysz naocznie, iż std::cout faktycznie wypisuje nam to, co chcemy :D

Po kolejnych dwóch uderzeniach w jeden z klawiszy powrócimy do funkcji main() , a strzałka zwana punktem wykonania ustawi się na

getch();

Moglibyśmy teraz użyć F11 i zobaczyć kod źródłowy funkcji getch() , ale to ma raczej niewielki sens. Poza tym, darowanemu koniowi (jakim są z pewnościa tego rodzaju funkcje!) nie patrzy się w zęby :) Posłużymy się przeto klawiszem F10 i pozwolimy funkcji wykonać się bez przeszkód.

Zaraz zaraz. Gdzie podziała się strzałka? Czyżby coś poszło nie tak?. Spokojnie, wszystko jest w jak najlepszym porządku. Pamiętamy, że funkcja getch() oczekuje na przyciśnięcie dowolnego klawisza, więc teraz wraz z nią czeka na to cała aplikacja. Aby nie przedłużać nadto wyczekiwania, przełącz się do okna konsoli i uczyń mu zadość :)

I tak oto dotarliśmy do epilogu - punkt wykonania jest teraz na końcu funkcji main() . Tu kończy się kod napisany przez nas, na program składa się jednak także dodatkowy kod, dodany przez kompilator. Oszczędzimy go sobie i wciśnięciem F5 (tudzież Debug|Continue ) pozwolimy przebiec po nim sprintem i w konsekwencji zakończyć program.

Tą oto drogą zapoznaliśmy się z bardzo ważnym narzędziem pracy programisty, czyli trybem krokowym, pracą krokową lub trybem śledzenia 2 . Widzieliśmy, że pozwala on dokładnie przestudiować działanie programu od początku do końca, poprzez wszystkie jego instrukcje. Z tego powodu jest nieocenionym pomocnikiem przy szukaniu i usuwaniu błędów w kodzie.

Przebieg programu

Konkluzją naszej przygody z funkcjami i pracą krokową będzie diagram, obrazujący działanie programu od początku do końca:


Schemat 2. Sposób działania przykładowego programu


Czarne linie ze strzałkami oznaczają wywoływanie i powrót z funkcji, zaś duże białe - ich wykonywanie. Program zaczyna się u z lewej strony schematu, a kończy po prawej; zauważmy też, że w obu tych miejscach wykonywaną funkcją jest main() . Prawdą jest zatem fakt, iż to ona jest główną częścią aplikacji konsolowej.

Jeśli opis słowny nie był dla ciebie nie do końca zrozumiały, to ten schemat powinien wyjaśnić wszystkie wątpliwości :)

1 Oczywiście może ona przy tym wykonywać pewne dodatkowe operacje

2 Inne nazwy to także przechodzenie krok po kroku czy śledzenie


| | | |
Copyright © 2006-2013 egrafik.pl | Kontakt | Reklama | Projekty domów
jocker