oowan napisał(a):
Autor kilka razy podkreśla, że te kwestie trzeba w 100% zrozumieć, więc pytam i będę wdzięczny za wyjaśnienia.
Ja przede wszystkim dziękuję za pytania i pomimo to, że starałem się to wyjaśnić w książce - a być może mi nie wyszło do końca jeśli chodzi o kolegę - to tym bardziej doceniam pytanie - zamiast męczenie się gdzieś po kątach. Z chęcią spróbuję tutaj doprecyzować - może mi się uda - a jeśli nie mnie to może jeszcze inne osoby podpowiedzą/opowiedzą to swoimi słowami.
oowan napisał(a):
Co określa, że funkcja ma zająć "tym razem" obszar pamięci FLASH?
Zacznę od tego co na str 59. Zobacz - gdy nie ma w kodzie ciała funkcji i mamy TYLKO jej nagłówek:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
(widzisz ? kończy się średnikiem) .... to to jest DEKLARACJA funkcji. Nie ma kodu funkcji, nie ma jej ciała - więc nie może to być jej DEFINICJA. Ale jeśli zobaczysz w kodzie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli nawiasy klamrowe w których widzisz kod źródłowy tej funkcji czyli jej "ciało" no to na ten kod potrzebna jest pamięć FLASH nieprawdaż ? trzeba gdzieś go przetłumaczyć na asembler i umieścić w pamięci aby mógł się ten kod wykonywać. I to jest DEFINICJA funkcji.
------------------------ [ Dodano po: 4 minutach ]oowan napisał(a):
Czym różnią się te dwa zapisy (oprócz słowa extern) że pierwszy jest deklaracją, a drugi definicją?
Ze zmiennymi jest troszkę inaczej, bo przecież zmienna to zmienna , nie ma ona żadnego kodu źródłowego prawda? Więc każde wystąpienie zmiennej nie poprzedzonej słówkiem extern, oznacza, że jest to jej DEFINICJA - czyli kompilator zarezerwuje na tę zmienną miejsce w pamięci RAM, lub FLASH lub EEPROM zależnie jak ją zdefiniujesz.
Specyfikator extern dodajemy w plikach nagłówkowych *.h bo to te pliki inkludujemy w ramach projektu. Tu musisz doczytać jeszcze w książce o podziale projektu na pliki żeby się lepiej wyjaśniło. Ale kontynuując - jeśli chcesz aby jakaś zmienna, którą zdefiniowałeś sobie w pliku np keyb.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
była dostępna w innym pliku *.c to musisz w tymże innym pliku zainkludować plik keyb.h .... a w nim podpowiedzieć kompilatorowi, że gdzieś w projekcie jest definicja zmiennej o nazwie "a"
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
dzięki czemu będziesz mógł w tym innym pliku *.c korzystać z tejże zmiennej.
------------------------ [ Dodano po: 12 minutach ]oowan napisał(a):
Nie rozumiem dlaczego jako argument funkcji zapal_bit raz jest użyta zmienna nr, a innym razem stała dosłowna 5?
Dlaczego zmienna nr nie jest zainicjowana i jaką przyjmuje wartość?
Uwaga! wyróżniamy coś takiego jak
DEKLARACJĘ funkcji
DEFINICJĘ funkcji
ale jeszcze jest coś takiego jak wywołanie tejże funkcji gdzieś później w kodzie.
jeśli więc masz funkcję
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to nazwa argumentu "st" jest parametrem formalnym w tym przypadku - i taką nazwą "st" posługujesz się w kodzie źródłowym (w ciele tej funkcji)
Natomiast tę funkcję wywołujemy później gdzieś w kodzie np tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
albo
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i zobacz - pokazałem ci dwa wywołania funkcji w kodzie - do której przekazaliśmy parametry aktualne - czyli nazwy z kodu z funkcji nadrzędnej albo stałe dosłowne. W pierwszym przypadku do ciała funkcji trafi argument o wartości 'a' a w drugim przypadku argument o wartości 'P'
ten sam przykład ale z liczbami a nie znakami ASCII
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i wywołania gdzieś w kodzie:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
albo np:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widzisz - nazwy parametrów FORMALNYCH absolutnie nie muszą być takie same jak AKTUALNYCH. Ba! w przypadku stałych dosłownych przecież nawet w ogóle nie przekazujemy nazwy fun1( 6 ); prawda ?
Argumenty służą tylko do przekazania wartości albo wskaźnika
------------------------ [ Dodano po: 15 minutach ]Na koniec dodam - że to co tu piszę - także napisane jest w książce - ale może zatrzymałeś się czytając - a tymczasem za kilka stron właśnie o tym będzie

Dlatego zawsze powtarzam - tę książkę warto najpierw JEDEN RAZ przeczytać w całości. Nie po to żeby zapamiętać wszystko bo nie da rady. Ale przynajmniej utkwi w pamięci - że gdy trafisz na coś niezrozumiałego czytając później drugi raz na spokojnie - że na pewno ciut dalej będzie o tym mowa ale już z przykładami
------------------------ [ Dodano po: 22 minutach ]Przy okazji - nieco inne spojrzenie na parametry formalne i aktualne - może też się przyda dla lepszego zrozumienia
http://polska.superhost.pl/funkcje2.htm