ANSI C 2

ANSI C 2



4 FUNKCJE I STRUKTURA PROGRAMU

Deklaracja

double sum, atof(char[ ]);

mówi, że zmienna sum jest typu double oraz że atof jest funkcją, która oczekuje jednego argumentu typu char[] (tablicy znakowej) i zwraca wartość typu double.

Deklaracja i definicja funkcji atof muszą być zgodne. Jeśli typy funkcji atof i jej wywołania w main są sprzeczne, a obie funkcje występują w tym samym pliku źródłowym, to kompilator zasygnalizuje błąd. Natomiast gdyby funkcja atof była tłumaczona oddzielnie (co jest bardzo prawdopodobne), to niezgodność ta nie zostałaby wykryta: atof produkowałaby wartości typu double, które funkcja main traktowałaby jako int; otrzymane wyniki nie miałyby sensu.

W świetle tego, co dotychczas powiedzieliśmy na temat deklaracji - że muszą być zgodne z definicją - takie nieporozumienie może wydawać się niespodzianką. Przyczyną niezgodności jest to, że jeśli nie ma prototypu funkcji, to jest ona przez domniemanie deklarowana swoim pierwszym pojawieniem się w wyrażeniu, np.

sum += atof(line);

Jeżeli nazwa, która nie była uprzednio zadeklarowana, pojawi się w wyrażeniu, a bezpośrednio po niej następuje otwierający nawias okrągły, to jest ona deklarowana przez kontekst jako nazwa funkcji i przez domniemanie przyjmuje się, że funkcja ta zwraca wartość typu int. Nie ma jednak żadnych przesłanek na temat parametrów funkcji. Co więcej, jeśli w deklaracji funkcji nie podano parametrów, np.

double atof();

to także przyjmuje się, że o parametrach funkcji atof nie należy robić żadnych założeń; wyłącza się więc całą kontrolę poprawności. Takie specjalne znaczenie pustej listy argumentów w deklaracji funkcji wprowadzono po to, by nowym kompilatorom umożliwić tłumaczenie starszych programów napisanych w języku C. Ale złym pomysłem jest stosowanie tego w nowych programach. Jeśli funkcja wymaga parametrów, zadeklaruj je; jeśli nie - użyj typu void.

Mając poprawnie zadeklarowaną funkcję atof, możemy napisać funkcję atoi (zamiana ciągu cyfr na liczbę całkowitą):

/* atoi: zamień ciąg cyfr s na wartość całkowitą; użyj atof */

int atoi(char s[ ])    •    j

{

double atof (char s[ ]); return (int) atof(s);

)    tńlŚA    I

Zwróć uwagę na strukturę deklaracji i na instrukcję return. Wartość return wyrażenie;

jest przekształcana do typu funkcji przed wykonaniem instrukcji return. A zatem wartość atof, typu double, zostanie automatycznie przekształcona do int przed wykonaniem tej instrukcji, gdyż typem funkcji atoi jest int. Ta operacja może jednak powodować utratę dokładności, więc pewne kompilatory przed tym ostrzegają. Operator rzutowania (int) wyraźnie stwierdza, że taka operacja jest zamierzona, i likwiduje wszelkie komentarze.

Ćwiczenie 4.2. Uzupełnij funkcję atof tak, aby obsługiwała także „naukową” (wykładniczą) notację o postaci

123.45e-6

w której bezpośrednio po liczbie zmiennopozycyjnej może wystąpić litera e lub E oraz wykładnik ewentualnie ze znakiem liczby.


Zmienne zewnętrzne

Program w języku C składa się ze zbioru obiektów zewnętrznych, którymi mogą być zarówno zmienne, jak i funkcje. Przymiotnika „zewnętrzny” (ang. external) użyto głównie dla kontrastu z przymiotnikiem „wewnętrzny” (ang. internat), który opisuje argumenty i zmienne definiowane wewnątrz funkcji. Zmienne zewnętrzne definiuje się poza wszystkimi funkcjami, są więc potencjalnie dostępne dla wielu funkcji. Same funkcje są zawsze zewnętrzne; w języku C nie dopuszcza się definiowania funkcji wewnątrz innej funkcji. Przez domniemanie przyjmuje się, że wszystkie odwołania do zmiennych zewnętrznych i do funkcji za pomocą tej samej nazwy, nawet z funkcji tłumaczonych oddzielnie, są odwołaniami do tego samego obiektu. (W standardzie taka właściwość nazywa się zewnętrzną łącznością nazwy.) W tym sensie zmienne zewnętrzne są podobne do bloków COMMON w Fortranie lub do zmiennych zadeklarowanych w najbardziej zewnętrznym bloku w Pascalu. Zobaczymy później, jak definiować zmienne zewnętrzne i funkcje widziane jedynie wewnątrz jednego pliku źródłowego.

To, że zmienne zewnętrzne są ogólnie dostępne, ma znaczenie przy przesyłaniu danych między funkcjami - są one alternatywą dla argumentów funkcji i zwracanych przez nie wartości. Dowolna funkcja może odwołać się do zmiennej zewnętrznej za pomocą jej nazwy, jeżeli tylko ta nazwa jest gdzieś zadeklarowana.

Dla funkcji wymagających dostępu do dużej liczby wspólnych danych zmienne zewnętrzne są wygodniejsze i bardziej skuteczne niż długie listy argumentów. Jak wykazano w rozdz. 1, zmienne zewnętrzne powinny być jednak stosowane z pewną

107


Wyszukiwarka

Podobne podstrony:
ANSI C 2 4 FUNKCJE I STRUKTURA PROGRAMU Jeśli wstawiany plik zostanie zmieniony, to naturalnie wsz
ANSI C 7 4 FUNKCJE I STRUKTURA PROGRAMU _________ Rozróżnienie deklaracji zmiennej zewnętrznej i j
ANSI C 9 4 FUNKCJE I STRUKTURA PROGRAMU gdyż słowo register w deklaracjach nadliczbowych czy też n
ANSI C 9 4 FUNKCJE I STRUKTURA PROGRAMU 4 FUNKCJE I STRUKTURA PROGRAMUWprowadzenie Na początku opr
ANSI C 0 4 FUNKCJE I STRUKTURA PROGRAMU /* getline: wczytaj wiersz do tablicy s; podaj jego długoś
ANSI C 1 4 FUNKCJE I STRUKTURA PROGRAMU wykonywalnego pliku zwanego a.out. Jeśli wystąpi błąd, np.
ANSI C 3 4 FUNKCJE I STRUKTURA PROGRAMU rozwagą, ponieważ mogą niekorzystnie wpływać na strukturę
ANSI C 4 4 FUNKCJE I STRUKTURA PROGRAMU Funkcja main jest pętlą zawierającą ogromną instrukcję swi
ANSI C 5 4 FUNKCJE I STRUKTURA PROGRAMU_________^ Zmienna jest zewnętrzna, jeśli zdefiniowano ją n
ANSI C 6 4 FUNKCJE I STRUKTURA PROGRAMU_________._—---- W bibliotece standardowej występuje funkcj
ANSI C 8 4 FUNKCJE I STRUKTURA PROGRAMU Jest jeszcze jedna rzecz, o którą należy się zatroszczyć -
ANSI C 0 4 FUNKCJE I STRUKTURA PROGRAMU-------------- zamiast int Iow, high, mid; Iow = 0; high =
ANSI C 1 4 FUNKCJE I STRUKTURA PROGRAMU I* qsort: uporządkuj v[left]...v[right] rosnąco */ void qs
ANSI C 3 4 FUNKCJE I STRUKTURA PROGRAMU zostanie rozwinięte w wiersz printf(Mx/yM ” = %g

33 □ LEKCJA 34 Struktura programu w C++ ( deklaracje, stałe, zmienne, wyrażenia
sciaga z proby Zmienna losowa Ciągła - Zmienna losowa jest typu ciągłego, jeżeli jej dystrybuanta F(
sciaga z proby Zmienna losowa Ciągła - Zmienna losowa jest typu ciągłego, jeżeli jej dystrybuanta F(
tpn 1 22481901 398 GEOGRAFIA FIZYCZNA ZIEM POLSKICH się głównie tem, że spadek ich jest niejednos
308 309 308 Programowanie wypukłe i kwadratowe tarnej x?2 i niemożność jej wymiany ze zmienną y2 (wa

więcej podobnych podstron