K U R S
Wielopoziomowe menu w C
Opisane w artykule funkcje wykona-
Jednym z najwikszych połeraczy czasu i energii
łem jako demonstracj sposobu imple-
programisty, obok uruchomienia programu, jest tak zwany
mentacji menu. Nie są one związane
z ładnym konkretnym urządzeniem. Do
interfejs ułytkownika. Mikrokontroler nie potrzebuje do pracy
ich uruchomienia ułyłem płytki ekspe-
rymentalnej własnej konstrukcji, zbliło- wyświetlacza, klawiatury, diod świecących LED i temu
nej funkcjonalnie do AVR Starter Kit
podobnych elementw, o ile nie jest to ściśle związane
i zawierającej mikrokontroler AT89S8252,
programator oraz złącza doprowadzające
z operacjami zapisu lub odczytu danych. Wszystkie te
sygnał do wyprowadze mikrokontrole-
drobiazgi są potrzebne nam, ludziom, abyśmy mogli
ra. Do płytki podłączyłem wyświetlacz
LCD (pracuje z interfejsem 4-bitowym)
wprowadzaĘ parametry i poznaĘ rezultat wykonania przez
oraz klawiatur wykonaną jako matryc
mikrokontroler określonego programu.
3 wierszy i 4 kolumn (w sumie 12 kla-
wiszy). Port P2, do ktrego podłączy-
W artykule przedstawi sposoby tworzenia jedno-
łem klawiatur, dodatkowo wyposałyłem
i dwupoziomowych menu, wyświetlanych na typowym
w rezystory pull-up o wartości 47 k&!.
Ułyłem ich ze wzgldu na długie kable
wyświetlaczu LCD 4 linie po 20 znakw.
łączące klawiatur z portem mikrokont-
rolera. W tab. 1 i na rys. 1 zawarto
opis połącze elektrycznych. numer 0 argumentu (argument wywoła- ki) poleceniem curr &= Row_mask (ilo-
nia np. 0xFE), drugiej bitu numer czyn bitowy). WartośĘ maski rwnieł
Odczyt klawiatury 1 itd. W pliku nagłwkowym KBD3X4.H zdefiniowana została w pliku nagłwko-
Funkcje odczytujące klawiatur za- za pomocą dyrektywy #define zdefinio- wym. Bit aktywny przyjmuje stan niski.
deklarowałem jako zewntrzne funkcje wano właściwe wartości argumentu wy- W związku z tym, łe łatwiej jest porw-
biblioteczne i umieściłem w module wołania funkcji KBD_Read (Co- nywaĘ bity znajdujące si w stanie wy-
o nazwie KBD3X4. Pierwsza z nich char lumn_1...3), ktre pniej uływane są sokim, wartośĘ zwracanej zmiennej jest
KBD_Read(char column) słuły do obsłu- przez funkcj Key_Number. negowana (polecenie return(~curr), ~
gi klawiatury na poziomie sprztu, ope- Sposb funkcjonowania KBD_Read to operator dopełnienia jedynkowego).
rując na portach mikrokontrolera. Dru- jest nastpujący: argument column jest Funkcja Key_Number przyporządko-
ga - char Key_Number(void) - przydzie- zapisywany do portu klawiatury i tym wuje kombinacjom bitw odczytanych
la klawiszom odpowiednie kody. samym linia ktrejś z kolumn przyjmu- z portu mikrokontrolera określone kody.
Funkcja KBD_Read w wyniku dzia- je stan niski. Na skutek przyciśnicia Konstrukcja programu zbliłona jest do
łania zwraca unikatową dla kałdego (zwarcia) klawisza linia wiersza - b- budowy klawiatury. Warunki if tworzą
z wciśnitych klawiszy, odpowiadającą dąca normalnie w stanie wysokim - rodzaj matrycy, na ktrej przeciciach
mu wartośĘ lub 0 - jeśli ładen z kla- przejdzie w wymuszony stan niski. Stan znajdują si kody klawiszy. Wartości
wiszy nie jest wciśnity. Nie pracuje ten jest dwukrotnie odczytywany przez Row_1...4 rwnieł predefiniowane są
ona poprawnie, jeśli wciśnito wicej mikrokontroler: za drugim razem po 50 w pliku nagłwkowym. Jedynka na po-
nił jeden klawisz. Zawsze zwracana milisekundach. Zrobiłem tak, aby zycji bitu wiersza odpowiada wciśni-
jest jako pierwsza kombinacja klawiszy upewniĘ si, łe klawisz został naciś- ciu klawisza. W przypadku, gdy ładen
z kolumny bdącej pierwszą odczytaną. nity celowo i było to zamiarem ułyt- z klawiszy nie jest naciśnity, funkcja
Jako argument wywołania spodziewane kownika. Jest to rwnieł bardzo prosty zwraca wartośĘ 0.
jest wyzerowanie bitu odpowiadającego filtr zakłce mogących pojawiĘ si na
odczytywanej kolumnie. W związku doprowadzeniu portu. Menu jednopoziomowe
z tym, łe kolumna pierwsza klawiatury Aby zapobiec wpływowi na wynik Najprostszym rodzajem menu jest me-
podłączona jest do P2.0, druga do P2.1 działania funkcji bitw innych nił przy- nu jednopoziomowe. Charakteryzuje si
a trzecia do P2.2, odczytowi pierwszej porządkowane wierszom klawiatury, są ono tym, łe po wybraniu opcji nastpu-
kolumny odpowiada wyzerowanie bitu one maskowane (ustawiane w stan nis- je bezpośrednie wywołanie akcji. Menu
takie jest łatwe do wykonania, jeśli
Tab. 1. Przypisanie funkcji wyprowadzeniom mikrokontrolera w całości mieści si na ekranie LCD.
Znacznie gorzej jest, gdy ma ono na
Nazwa portu Oznaczenie Funkcja
Nazwa portu Oznaczenie Funkcja
Nazwa portu Oznaczenie Funkcja
Nazwa portu Oznaczenie Funkcja
Nazwa portu Oznaczenie Funkcja
przykład 8 pozycji, a na ekranie mamy
P2.0 PC0 Doprowadzenie pierwszej kolumny matrycy klawiszy
do dyspozycji 2 czy 4 linie. Wwczas
P2.1 PC1 Doprowadzenie drugiej kolumny matrycy klawiszy
musimy nie tylko określiĘ nazwy po-
P2.2 PC2 Doprowadzenie trzeciej kolumny matrycy klawiszy szczeglnych opcji, ale rwnieł sposb
wyświetlania menu po przekroczeniu roz-
P2.3 PC3 Doprowadzenie drugiego wiersza matrycy klawiszy
miaru ekranu. Wyliczenie tych wszyst-
P2.4 PC4 Doprowadzenie trzeciego wiersza matrycy klawiszy
kich zmiennych zajmuje duło pamici
P2.5 PC5 Doprowadzenie czwartego wiersza matrycy klawiszy
programu oraz czasu mikrokontrolera.
P2.6 PC6 Doprowadzenie pierwszego wiersza matrycy klawiszy
Początek programu (czśĘ deklara-
P3.4 PD4 Sygnał RS wySwietlacza LCD cyjna zmiennych) zawiera definicj ty-
pu o nazwie menuitem. Jest to struktu-
P3.5 PD5 Sygnał READ wySwietlacza LCD
ra pojedynczego rekordu opisującego li-
P3.6 PD6 Sygnał ENABLE wySwietlacza LCD
ni menu. Rekordy te są nastpnie
P1.4 PB4 Bit 5 szyny danych wySwietlacza LCD
zgrupowane w tabeli menus, tam teł
P1.5 PB5 Bit 6 szyny danych wySwietlacza LCD
nadawana jest im wartośĘ. Kilku słw
P1.6 PB6 Bit 7 szyny danych wySwietlacza LCD omwienia wymaga rola poszczeglnych
pl rekordu.
P1.7 PB7 Bit 8 szyny danych wySwietlacza LCD
Elektronika Praktyczna 9/2003
77
K U R S
menu posługuj si zmienną globalną
o nazwie actpos. Jest to zmienna typu
signed char (z zakresu od -128...127).
Jej wartośĘ ulega zmianie po naciśni-
ciu klawiszy umownie przyjtych jako
kierunek dł (8) lub gra (2). Dodatko-
wo wartośĘ tej zmiennej porwnywana
jest z liczbami określającymi jej maksi-
mum i minimum. W przypadku przekro-
czenia maksimum, zmiennej actpos na-
dawana jest wartośĘ minimum i vice
versa: gdy jej wartośĘ jest mniejsza nił
wartośĘ minimalna, zmiennej nadawana
jest wartośĘ maksimum. Tu jedna uwa-
ga: wartośĘ maksymalną stanowi liczba
elementw tablicy menus. Jej elementy
numerowane są od 0. W związku z tym
numer ostatniego elementy tablicy to
rozmiar-1, a pierwszego to 0. Na sku-
tek tak przyjtej konwencji rwnieł
Rys. 1. Schemat klawiatury matrycowej 3 (kolumny) x 4 (wiersze) wykorzystywanej
i zmiennej actpos naleły w przypadku
w modelu
dolnej granicy zakresu nadaĘ wartośĘ
Pole o nazwie name to łacuch spowoduje przesunicie wskaza na po- maksymalnej liczby opcji pomniejszoną
znakw wyświetlany na ekranie i sta- zycj 4 w tablicy (pozycje numerowane o 1. Odpowiada za to polecenie if (--
nowiący nazw (etykiet) danej pozy- są od 0), a nie na liter c w napisie actpos < 0) actpos=maxoptions-1. Po-
cji menu. Jest on widziany przez ułyt- opcja 1 ., co odpowiadałoby dodaniu dobnie jest w przypadku grnej grani-
kownika dokonującego wyboru opcji. do wartości wskanika 3 bajtw. Tyle cy. Wskanik adresuje obszar lełący
Pole ptr to offset dodawany do adre- słowem przypomnienia o arytmetyce poza tablicą juł wwczas, gdy przyj-
su początku tablicy - wykazu menu. wskanikw. WrĘmy do sposobu defi- muje wartośĘ jej rozmiaru. Z mojej
Jego rola polega na wskazaniu miejs- niowania menu. praktyki wynika, łe mimo faktycznie
ca, od ktrego mają byĘ wyświetlane Po uruchomieniu funkcji wyświetla- zachodzącej rwności, w takiej sytuacji
etykiety menu. I tak dla przykładu jącej, wskanik do wykazu ustawiany bezpieczniej jest ułyĘ znaku wiksze
ptr=4 spowoduje, łe w linii numer jest na jego początek (pozycja 0). Na- lub rwne. W związku z tym linia
1 wyświetlacza LCD znajdzie si ety- stpnie pobierane są wartości programu przyjmuje postaĘ if (++actpos
kieta menu spod adresu menus+4. Ko- menus[0].y0 oraz menus[0].ptr. WartośĘ >= maxoptions) actpos=0.
lejne pole - y0 - to numer linii, ptr dodawana jest do adresu początku Program głwny wykonuje czynnoś-
w ktrej ma si znajdowaĘ znak wy- tablicy (w tym przypadku ptr=0) i od ci związane z obsługą wyświetlacza
boru w momencie, gdy wskanik aktu- wyliczonego w ten sposb adresu wy- (inicjalizacja trybu 4-bitowego oraz de-
alnej pozycji w tabeli-wykazie wskazu- świetlane są na ekranie LCD 4 etykiety finicja znakw ułytkownika), a nastp-
je na rekord związany z tym paramet- menu. nie wywołuje funkcj obsługi menu.
rem. Kombinacja dwch ostatnich pa- Parametr pobrany z tablicy y0 to ar- Zwracana przez t funkcj wartośĘ roz-
rametrw umołliwia efektywne i czy- gument funkcji wyświetlającej znaczni- patrywana jest nastpnie przez wyrałe-
telne wyświetlanie zawartości menu. ki wyboru. W tym przypadku, poniewał nie switch - case. Oczywiście mołna
Spjrzmy dla przykładu na deklaracj y0=0, znaczniki bdą wyświetlone na ułyĘ instrukcji if lub chociałby zbudo-
menu pochodzącą z prezentowanego wspłrzdnych (0,0) oraz (19,0). Podob- waĘ tablic z wykazem wywoływanych
programu: nie bdzie, gdy wskanik pokałe pozy- funkcji, a zwrconą w wyniku działania
//deklaracja tablicy-wykazu cj 2, 3 i dalsze. Za kałdym razem wartośĘ potraktowaĘ jako offset lub
//opcji menu wartości y0 i ptr określają pozycj zna- wskanik do tejłe tablicy.
code menuitem menus[maxoptions] = ku wyboru oraz t etykiet menu, kt-
{{ opcja 1 . , 0, 0}, ra znajdzie si w pierwszej linii wy- Menu dwupoziomowe
{ opcja 2 . , 0, 1}, świetlacza. Rozbudowując menu o dodatkowy
{ opcja 3 . , 0, 2}, Do wyliczenia wartości wskanika poziom, zawsze naleły liczyĘ si
{ opcja 4 . , 0, 3}, do aktualnej pozycji w tabeli-wykazie z tym, łe zajmie ono duło miejsca
{ opcja 5 . , 1, 3},
{ opcja 6 . , 2, 3},
List. 1. Sposób budowania definicji menu
{ opcja 7 . , 3, 3},
code menuitem mainmenus[6] =
{ opcja 8 . , 4, 3}}
{{name = opcja menu głównego 1 , |--> code submenu submenu1[3] =
ptr = 0, | {{ podmenu 1.1 ,0,0,11},
//deklaracja wskaznika do pozycji
y0 = 0, | { podmenu 1.2 ,0,1,12},
nextmenu = &submenu1, ----------------| {0,0,0,0}}
//w tablicy-wykazie menu
retval = 0},
code menuitem *ptrmenus = &menus;
{name = opcja menu głównego 2 , --> code submenu submenu2[7] = {
Wskanik ptrmenus jest tego same- ptr = 0, | {{ podmenu 2.1 ,0,0,21},
y0 = 1, | { podmenu 2.2 ,0,1,22},
go typu, co element tablicy - wykazu.
nextmenu = &submenu2, ----------------| { podmenu 2.3 ,0,2,23},
W związku z tym operacje arytmetyczne
retval = 0}, { podmenu 2.4 ,0,3,24},
wykonywane na wskaniku dodają (lub
{ podmenu 2.5 ,1,3,25},
{ podmenu 2.6 ,2,3,26},
odejmują) do (od) jego wartości liczb
{0,0,0,0}}
bajtw identyczną z rozmiarem pojedyn-
{name = opcja menu głównego 3 ,
czego elementu tablicy. Na przykład
ptr = 0,
wykonanie polece: y0 = 2,
nextmenu = 0,
ptrmenus = &menus
retval = 3},
ptrmenus = ptrmenus+3 //równoważne
............
//polecenie to ptrmenus += 3
Elektronika Praktyczna 9/2003
78
K U R S
w pamici mikrokontrolera. Sytuacja menu i jego opcje. WrĘmy do sposobu Ogranicza ona od gry wartośĘ zmien-
wygląda zupełnie inaczej, gdy tworzo- tworzenia definicji menu głwnego. Na nej globalnej POS_IN_SUBMENU, ktra
na jest aplikacja dla komputera PC list. 1 przedstawiono schemat budowy nie mołe byĘ wiksza nił maxsubopt-1
nił gdy dla mikrokontrolera. Ten pier- definicji menu głwnego oraz odpowia- i jest sprawdzana po kałdym naciśniciu
wszy w porwnaniu z drugim posiada dających mu opcji podmenu. klawisza w gr czy w dł.
niewyobrałalne wrcz zasoby do wyko- Tablica mainmenu zawiera wykaz Po wejściu do podmenu zaczyna
rzystania, istne morze pamici, przy definicji etykiet i parametrw menu rwnieł działaĘ klawisz o kodzie 0x0B
dodatkowo bardzo dułej szybkości dzia- głwnego. Polu wskanikowemu o na- pełniący rol podobną do ESCAPE
łania. Pewnych nawykw i przyzwycza- zwie nextmenu nadawana jest wartośĘ w komputerze PC. Jego naciśnicie powo-
je (o ile takie są) nie da si po pros- adresu - wskazania do wykazu opcji duje, łe nastpuje powrt do menu
tu w tym momencie wykorzystaĘ, cho- podmenu, jeśli takie istnieje. Kolorami głwnego bez podejmowania jakiejkolwiek
ciał nowe, pojawiające si na rynku wyrłniono te przypisania. W takim akcji i mołna wwczas dokonaĘ innego
mikrokontrolery imponują wrcz swoi- przypadku pole retval ma wartośĘ 0. wyboru. Wybr zawsze potwierdzany jest
mi zasobami sprztowymi. Zostawmy Gdy podmenu nie istnieje (mołe to byĘ przez naciśnicie klawisza ENTER.
jednak rozwałania i wrĘmy do opisu na przykład opcja Uruchom, Oblicz Podobnie jak w poprzednim przykła-
sposobu wykonania menu. itp.), polu retval nadawana jest war- dzie, program głwny zawiera inicjaliza-
Przy jego budowie posłułyłem si tośĘ, ktrą ma zwrciĘ funkcja, a polu cj wyświetlacza, wywołanie funkcji ob-
rozwiązaniami z pierwszego przykładu nextmenu naleły przypisaĘ wartośĘ 0. sługi menu oraz konstrukcj switch -
programowania, jednak wyranie zosta- Wymagane jest, aby kałda tablica- case w celu rozpoznania wybranej opcji.
ły rozgraniczone menu głwne od me- wykaz etykiet podmenu była zakoczo-
nu podrzdnego. Rozgraniczają je za- ny rekordem, w ktrym co najmniej po- Uwagi na temat programu
rwno funkcje realizujące wyświetlanie le name ma wartośĘ 0. Rekord ten jest Funkcje w moich przykładach czsto
etykiet i wybr spomidzy nich, jak niezbdny, poniewał na podstawie jego posługują si wskanikami do struktur.
i typy rekordw ułytych do deklaracji. połołenia obliczana jest przez funkcj Ich konstrukcja oraz sposb zapisu jest
Rozpocznijmy analiz od menu głwne- wyświetlającą podmenu długośĘ wyka- specyficzny i wymaga kilku słw om-
go. Dla potrzeb budowy tablicy-wykazu zu opcji, a tym samym liczba etykiet wienia zwłaszcza dla tych osb, ktre
opcji menu głwnego zadeklarowałem do wyświetlenia. spotykają si z nimi po raz pierwszy.
typ o nazwie menuitem. Zawiera on Menu głwne wyświetlane jest Definicja tabeli zawierającej rekordy
pola poznane juł wcześniej (name, ptr w identyczny sposb jak to było robio- jest doskonałym mechanizmem zwłasz-
i y0) i oprcz nich nowe, o nazwach ne w przypadku menu jednopoziomowe- cza przy tworzeniu baz danych i pli-
nextmenu oraz retval. go. Jego obsługą zajmuje si funkcja kw dyskowych. I chociał w tych przy-
Pole nextmenu to wskanik do ob- Main_Menu i jej funkcje usługowe. Jako kładach programw nie są uływane
szaru wykazu opcji odpowiadającego rezultat zwraca ona liczb jednobajto- ładne zbiory znajdujące si na dysku,
mu podmenu. W przypadku, gdy na- wą bdącą kodem wybranej opcji. to jednak tablica rekordw do złudze-
stpny poziom nie jest dostpny, Po naciśniciu klawisza o kodzie nia przypomina struktur bazy danych,
wskanikowi nadawana jest wartośĘ 0. 0x0C umownie funkcjonującego jako EN- a lełący gdzieś w obszarze code pami-
Z tym polem ściśle związana jest za- TER, funkcja sprawdza, czy pole next- ci mikrokontrolera wykaz - plik dysko-
wartośĘ pola retval. Zawiera ono licz- menu przyporządkowane biełącej pozy- wy. Istnieją dwie podstawowe metody
b zwracaną przez funkcj w przypad- cji zawiera jakąś wartośĘ. Jeśli tak, fun- odwoływania si do pozycji w takiej
ku wyboru opcji. Jak łatwo si domyś- kcja wywołuje obsług podmenu jako strukturze:
liĘ, wartośĘ wpisana do retval nie ma parametr, podając zawartośĘ odpowied- - z zastosowaniem indeksw (np. me-
ładnego znaczenia w przypadku, gdy niego pola nextmenu. W związku z tym, nus[1], menus[5] itd.),
wywoływane jest podmenu. Wwczas łe chciałem napisaĘ funkcj uniwersal- - z zastosowaniem wskanika (wskani-
to, funkcja obsługi menu zwrci war- ną, zdolną do wyświetlenia podmenu kw).
tośĘ zapisaną w polu retval właściwą o rłnych ilościach etykiet, przy wywo- Ta pierwsza metoda jest bardzo
dla danej opcji (etykiety) podmenu. łaniu funkcja musi obliczyĘ, jaka jest prosta. Ilustruje ją przykład umieszczo-
Wskanik nextmenu jest typu sub- liczba pozycji wykazu przekazanego ja- ny na list. 2. Indeks to po prostu nu-
menuitem. Ten typ zmiennych został ko argument wywołania. Minimalna mer pozycji w tabeli, do ktrego łąda
utworzony dla potrzeb tablic-wyka- wartośĘ to 1, maksymalna 127. Koniec dostpu aplikacja. Jeśli mamy do czy-
zw opcji menu drugiego poziomu. Jest wykazu rozpoznawany jest po tym, łe nienia z tabelą zawierającą 10 elemen-
on prawie taki sam, jak uływany do pole name (etykieta menu) ma wartośĘ tw, to indeks mołe przyjąĘ wartości
potrzeb menu głwnego. ale oprcz pod- znaku o kodzie 0. Wynik oblicze zapa- od 0 do 9. Gdy mamy do czynienia
stawowych pl (etykieta name, połołe- mitywany jest w zmiennej maxsubopt. z tablicą struktur, dostp do pola moł-
nie znaku wyboru y0, offset wskanika
ptr oraz wartości zwracanej przez menu
List. 2. Odwołanie do tablicy rekordów poprzez indeksy
retval) nie zawiera ładnych wskanikw
typedef struct //definicja typu - struktury (rekordu) danych
do nastpnych wykazw opcji.
{
Łatwo jest rozbudowaĘ podmenu
char x; //struktura zawiera 3 pola typu char: x, y, colour
o nastpne poziomy. Wystarczy ułyĘ po- char y;
char colour;
dobnych mechanizmw jak dla budowy
} attr;
poziomu 2. Jest w tym jednak drobna
trudnośĘ: naleły w jakiś sposb podaĘ data attr points[10]; //deklaracja tablicy zawierającej rekordy danych
ułytkownikowi informacj, z ktrego me-
void main()
nu wybierana jest opcja, ot chociałby
{
przez wyświetlenie ściełki - opisu miej-
char temp;
sca, w ktrym si znajduje. Trudno jest attr pt;
znaleĘ to miejsce na ekranie LCD
points[0].x = 1; //nadanie wartości polu x tablicy wskazywanemu
o niewielkich rozmiarach. W praktyce
//przez indeks 0
ograniczam wic menu budowanych
temp = points[8].y; //pobranie wartości pola y wskazywanemu przez indeks 8
//do zmiennej temp
przez siebie urządze co najwyłej do
pt = point[2]; //przepisanie rekordu danych z tablicy (indeks=2)
2...3 poziomw i zazwyczaj nie ma po-
//do zmiennej pt będącej
trzeby tworzenia dalszej hierarchii. Za-
} //tego samego typu, co element tablicy
miast tego warto jest przemyśleĘ układ
Elektronika Praktyczna 9/2003
79
K U R S
Odwołanie do pola struktury umoł-
List. 3. Odwołanie do tablicy rekordów poprzez wskaznik
liwia operator wyglądający jak strzałka
typedef struct //definicja typu - struktury (rekordu) danych
skierowana w prawo, utworzony ze
{
znaku wikszości oraz odejmowania (-
char x; //struktura zawiera 3 pola typu char: x, y, colour
char y;
>) nastpującego bezpośrednio po nim.
char colour;
Stosując go, naleły pamitaĘ, łe ma
} attr;
bardzo wysoki priorytet. Operacje
data attr points[10]; //deklaracja tablicy zawierającej rekordy danych (pointer+temp)->x oraz temp+pointer->x
data attr *pointer = &points; //deklaracja wskaznika oraz nadanie mu wartości
nie są rwnowałne. Jednak bardziej
//początkowej: wskazania na początek tablicy points
jaskrawy przykład stanowi porwnanie
sposobu funkcjonowania wyrałe
void main()
{
++pointer->x oraz (++pointer)->x.
char temp;
W tym pierwszym przypadku wyrałe-
attr pt;
nie zwiksza zmienną x o 1, a nie
pointer->x = 1; //nadanie wartości polu x tablicy wskazywanemu wskanik do struktury. W drugim
//przez indeks 0
wskanik jest zwikszany przed odwo-
temp = (pointer+8)->y; //pobranie wartości pola y wskazywanemu przez
łaniem do struktury i na skutek tego
//indeks 8 do zmiennej temp
nastpuje przejście do nastpnego
pt = pointer+2; //przepisanie rekordu danych z tablicy (indeks=2)
//do zmiennej pt będącej w kolejności elementu tablicy.
} //tego samego typu, co element tablicy
Na tej samej zasadzie wyrałenie:
- *pointer->x udostpnia coś, na co
wskazuje x,
na uzyskaĘ podając po kropce jego na- pointer_1++; //spowoduje przesunię- - *pointer->x++ zwiksza x po udostp-
zw: zmienna = menu[1].ptr. //cie wskazania zmiennej nieniu obiektu wskazywanego przez
Inaczej ma si sytuacja, gdy odwo- //points[0].x na points[0].y x,
łanie do struktury odbywa si przez //(o 1 bajt) - (*pointer->x)++ zwiksza coś, na co
wskanik. Posłułmy si tym samym pointer_2++; //spowoduje przesunię- wskazuje x,
przykładem - na list. 3 umieszczono //cie wskaznika z rekordu - *pointer++->x zwiksza zmienną
program zmodyfikowany w taki sposb, //points[0] na points[1] i jest pointer po udostpnieniu obiektu
aby odwołania do pl nastpowały //równoważne wyrażeniu wskazywanego przez x.
przez wskanik a nie przez indeks. //pointer_1 = Jak wspomniałem wcześniej, wyko-
Wskanik powinien byĘ tego same- //pointer_1 + sizezeof(attr) rzystując mechanizmy ułyte do budowy
go typu, co wskazywany obszar da- pointer_1 += 8; //spowoduje przesu- drugiego poziomu menu łatwo jest do-
nych. W konsekwencji wszelkie opera- //nięcie wskaznika o 8 bajtów, to daĘ nastpne poziomy. Wystarczy, łe
cje arytmetyczne na nim wykonywane //jest na zmienną points[2].y typ submenuitem bdzie zawierał wska-
powodują jego zmian o taką liczb baj- pointer_2 += 8; //spowoduje przesu- nik do nastpnego wykazu menu, a fun-
tw, jaki jest rozmiar wskazywanego //nięcie wskaznika o 8 rekordów, kcja Sub_Menu zapamita i przechowa
elementu. Ilustracją tej zasady jest po- //to jest na pozycję 9 w tabeli stan zmiennej POS_IN_SUBMENU. Praw-
niłszy przykład: pointer_1 += temp; //spowoduje dopodobnie bdzie rwnieł wymagaĘ
//przesunięcie wskazania o 2 baj- słowa kluczowego reentrant (kompilator
data char *pointer_1 = &points; //ty, to jest na zmienną RC-51) powodującego, łe funkcja mołe
data attr *pointer_2 = &points; //points[0].colour byĘ wywoływana rekurencyjnie. Rozbu-
data char temp = 2; pointer_2 += temp; //spowoduje dow pozostawiam jednak inwencji
... //przesunięcie wskaznika o 2 re- własnej Czytelnika.
... //kordy, to jest na pozycję Jacek Bogusz, AVT
... //3 w tabeli jacek.bogusz@ep.com.pl
Elektronika Praktyczna 9/2003
80
Wyszukiwarka
Podobne podstrony:
Wielopoziomowe menu w PHPpu srvc menu nlmenu cwiczenia14menumenumenul menumenumenu (67)Menu 3181 menu (6)184 menu (2)265 menujava awt Menuwięcej podobnych podstron