5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak:
5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI
w miejscu wywołania:
jslasza wersja funkcji getint zwraca: EOF - gdy napotka koniec plikuj. kolejne znaki z wejścia nie tworzą liczby, oraz wartość dodatnią - jeśli na wejściu
1 ^ nAnroumo I iptKa *
Argumenty wskaźnikowe pozwalają funkcji mieć dostęp do (a więc i zmieniać wartość) obiektów należących do funkcji wywołującej. Jako przykład rozważmy funkcję getint, która wczytując nie sformatowane dane wejściowe, przekształca strumień znaków na wartości całkowite (jedną na każde wywołanie). Funkcja ta musi przekazać znalezioną wartość oraz sygnał końca pliku, gdy nie ma już więcej znaków z wejścia Obie wartości muszą być przesłane dwiema oddzielnymi ścieżkami, gdyż niezależnie od tego, jaką wartość ma EOF, może ona być również wartością wczytanej liczby.
Jedno z rozwiązań polega na tym, że funkcja getint zwraca sygnał o napotkaniu końca pliku jako swoją wartość funkcyjną, podczas gdy znalezioną liczbę całkowitą przekazuje do funkcji wywołującej za pomocą argumentu wskaźnikowego. Taki sam schemat jest podstawą działania standardowej funkcji scanf; zajrzyj do p. 7.4.
W następującej pętli do wypełnienia tablicy wartościami całkowitymi użyto funkcji getint:
int n, array[SIZE], getint(int *);
for (n = 0; n < SIZE && getint(&array[nj) != EOF; n++)
#include <ctype.h>
int getch(void); void ungetch(int);
/* getint: wczytaj następną liczbę całkowitą */ int getint(int *pn)
int c, sign;
while (isspace(c = getch())) /* pomiń białe znaki */
I
if (! isdigit(c) && c != EOF && c != ’+’ && c != {
ungetch(c); /* to nie jest liczba */ return 0;
sign = (c == ? -1 : 1;
if (C == V 11 c == c = getch();
for(*pn = 0; isdigit(c); c = getch())
*pn = 10 * *pn + (c - ’0’);
*pn *= sign; if (c != EOF) ungetch(c); return c;
eałej funkcji getint konstrukcja *pn jest używana jak zwykła zmienna całkowi-
P°nadt° skorzystaliśmy z funkcji getch i ungetch (opisanych w p. 4.3), aby
.owy znak> który trzeba było przeczytać, mógł być z powrotem odesłany na WeJście.
W każdym kroku pętli wywołanie funkcji getint umieszcza w array[n) wartość kolei' nej wejściowej liczby; zwiększa się też licznik n. Zauważ, że przekazanie do funkcji getint adresu elementu array[n] jest konieczne, inaczej bowiem nie ma sposobu nat0, by mogła ona obliczoną wartość przekazać do miejsca wywołania.
\ ——
pr^ --
eja ^ ^iej definicji funkcji getint warunek w powyższej pętli trzeba uzupełnić sprawdzeniem, czy funk-liC2b Faca zero- Ppzy podanym warunku funkcja getint zatnie się na pierwszym znaku nic należącym do y zawsze sygnalizując zero), mimo że pętla będzie się kręcić dalej. - Przyp. tłum.
134
135