4 FUNKCJE I STRUKTURA PROGRAMU
/* getline: wczytaj wiersz do tablicy s; podaj jego długość */ int getline(char s[], int lim)
int c, i; i = 0;
while (—lim > 0 && (c=getchar()) != EOF && c != ’\n’) s[i++] = c; if (c == ’\n’) s[i++] = c; slil = ’\0’; return i;
I* strindex: określ pozycję tekstu t w s lub -1, gdy brak */ int strindex(char s[ ], char t[ ])
int i, j, k;
for (i = 0; s[i] != ’\0’; i++) {
for (j=i, k=0; t[k] != ’\0' && s[j] == t[k]; j++, k++)
if (k > 0 && tik] == ’\0’) return i;
return -1;
Każda definicja funkcji ma następujący format:
typ-powrotu nazwa-funkcji (deklaracje parametrów)
deklaracje i instrukcje
Różne części tej definicji można pominąć; najmniejszą funkcją jest funkcja dummy (atrapa):
dummy() {}
która nic nie robi i nie zwraca żadnej wartości. Takie nic nie robiące fukcje, jak t3' przydają się czasami do zarezerwowania miejsca podczas stopniowego rozwoju
4.1 WPROWADZENIE______I powered by
gramu. Jeśli w definicji pominięto typ-powrotu, to przyjmuje się, że fuffissjew wartość typu int.
Program jest właściwie zbiorem definicji zmiennych i funkcji. Komunikacja między funkcjami odbywa się za pośrednictwem argumentów wywołania funkcji i wartości zwracanych przez funkcje, a także za pośrednictwem zmiennych zewnętrznych.
W pliku źródłowym funkcje mogą występować w dowolnej kolejności, a program można podzielić między kilka plików źródłowych pod warunkiem, że żadna z funkcji nie zostanie podzielona.
Instrukcja return jest narzędziem, dzięki któremu wywołana funkcja przekazuje do miejsca wywołania wartość pewnego wyrażenia. Po słowie return może wystąpić dowolne wyrażenie:
return wyrażenie]
Jeśli zajdzie taka potrzeba, wyrażenie zostanie przekształcone do typu wartości zwracanej przez funkcję. Wyrażenie jest często otaczane nawiasami okrągłymi, ale nie jest to konieczne.
Funkcja wywołująca może zignorować zwracaną wartość. Poza tym instrukcja return nie musi zawierać wyrażenia; w takim przypadku do miejsca wywołania nie przekazuje się żadnej wartości. Sterowanie wraca bez wartości także wtedy, kiedy wykonywanie funkcji zakończy się po osiągnięciu nawiasu klamrowego zamykającego funkcję. Nie jest błędem, choć prawdopodobnie oznacza kłopoty, jeśli funkcja zwraca wartość z jednego miejsca, a z innego nie*. W każdym razie „wartością” funkcji, której nie udało się zwrócić poprawnej wartości, na pewno są śmiecie.
Program wyszukiwania wzorca za pomocą funkcji main zwraca stan osiągnięty po zakończeniu działania, czyli liczbę wierszy pasujących do wzorca. Z tej wartości może skorzystać otoczenie, w którym uruchomiono program.
Techniki tłumaczenia i ładowania programów w języku C, podzielonych między kilka plików źródłowych, zmieniają się zależnie od systemu. Na przykład w systemie Unix zadanie to jest realizowane przez polecenie cc, wspomniane w rozdz. 1. Przypuśćmy, że każda z naszych trzech funkcji jest zapamiętana w osobnym pliku i pliki te nazywają się: main.c, getline.c oraz strindex.c. Wówczas polecenie
cc main.c getline.c strindex.c
przetłumaczy je, umieści ich wynikowe kody pośrednie (ang. object codę) w plikach pośrednich main.o, getline.o i strindex.o, a następnie załaduje wszystkie razem do
Przyzwoite kompilatory wychwytują takie przypadki. - Przyp. tłum.