Jeżeli starałeś się intensywnie wcielić w życie plan pisania kodu wykonanego w oparciu o funkcje to z pewnością natrafiłeś na czynny opór kompilatora w chwili gdy chciałeś przekazać tablicę do funkcji. Być może doszedłeś do jednego z możliwych rozwiązań, tj. sposobie przekazywania tablicy jako argument do funkcji bądź znów ktoś podsunął Ci niezbyt trafiony pomysł ze zmiennymi globalnymi. Zmienne globalne to zło wcielone, które oczywiście ma swoje uzasadnione miejsce w przyrodzie, jednak dowiesz się o nim znacznie później - na chwilę obecną nie masz tego znać, a nawet jeżeli już je znasz to masz
całkowity zakaz ich używania. Dlaczego? Żebyś się nauczył programować, a nie rozwiązywać problemy metodą buta w drzwiach.
Przekazywanie tablicy jednowymiarowej do funkcji
W C++ mamy do dyspozycji kilka form zapisu przekazywania tablic do funkcji. W niniejszym rozdziale poznamy trzy sposoby zapisu osiągnięcia naszego celu. Zapisy, które zostaną przedstawione są względem siebie równoważne, a więc można ich używać zamiennie. Zapisy te wyglądają następująco:
void sposob_1( int tablica[ 123 ] );
void sposob_2( int tablica[] );
void sposob_3( int * tablica );
Jeżeli wykazałeś się kreatywnością rozwiązując zadanie z poprzedniego rozdziału to prawdopodobnie wystąpił w nim zapis, który występuje w funkcji
sposob_1, tj.
int tablica[ 123 ]
, gdzie 123 to liczba elementów w tablicy. Z punktu widzenia funkcji znajomość liczby elementów dla tablic jednowymiarowych jest zbędna. Wspomniany zapis zadziała więc tak samo jak zapis
int tablica[]
, który informuje kompilator jak również programistę o przekazywaniu tablicy do funkcji. Ostatni zapis natomiast mówi, że jest to wskaźnik na zmienną - szczegółów na chwilę obecną nie musisz znać. Jedyne co Ciebie powinno teraz interesować to fakt, że zapis ten jest również równoważny do wcześniej omówionych.
Kompilator wszystkie omówione zapisy zinterpretuje jako wskaźnik. Wskaźnik w rzeczywistości jest liczbą, która wskazuje na pierwszą komórkę pamięci zawierającą dane. Na chwilę obecną szczegółów nie musisz znać - zostaną one omówione w dalszej części kursu.
|
Dane tablicy w funkcjach
Tablice przekazywane do funkcji
nigdy nie są kopiowane. Oznacza to, że w funkcji masz bezpośredni dostęp do danych, które znajdują się w tablicy. Modyfikacja danych jest globalna, bowiem pracujesz na oryginalnych danych tablicy, która została przekazana do funkcji.
Przykład
Zobaczmy teraz jak wyglądać będzie przekazywanie tablicy do funkcji w praktyce:
#include <iostream>
void wypelnijTablice( int t[], int iRozmiar )
{
std::cout << "Podaj " << iRozmiar << " liczb:" << std::endl;
int i = 0;
do
{
std::cin >> t[ i ];
i++;
} while( i < iRozmiar );
}
int main()
{
int moja_tablica[ 5 ];
wypelnijTablice( moja_tablica, 5 );
int i = 0;
do
{
std::cout << moja_tablica[ i ] << ", ";
i++;
} while( i < 5 );
return 0;
}
Powyższy przykład powinien być dla Ciebie już na tyle prosty, że efekt działania powyższego programu powinien być dla Ciebie do przewidzenia. Dalej pozostaje Ci tylko ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć.
Pamiętaj, że zmienna o nazwie moja_tablica nie jest widoczna z poziomu funkcji wypelnijTablice, jak również zmienna t nie jest widoczna wewnątrz funkcji main. Dostęp do tablicy moja_tablica w funkcji wypelnijTablice posiadasz poprzez zmienną t. Powinieneś to już wiedzieć ze wcześniejszego rozdziału poświęconego funkcjom.
|
Zadanie domowe
Napisz program, który wylosuje 999 liczb całkowitych z zakresu od 4 do 10 włącznie, wypisze te wartości na ekran, po czym zsumuje je i wynik wypisze na ekran. Wszelkie operacje mają zostać zrealizowane w oparciu o funkcje. Tablica ma być zadeklarowana w funkcji
main. Oczekiwane funkcje:
Przykładowa implementacja funkcji main:
int main()
{
int tablica[ 999 ];
wylosujLiczby( tablica, 999, 4, 10 );
wypiszLiczby( tablica, 999 );
int iSuma = obliczSume( tablica, 999 );
std::cout << "Suma liczb wynosi: " << iSuma << std::endl;
return 0;
}