cz8

cz8



Programowanie

Programowanie

#def i ni


i nt8_t


bardziej rozbudowany typ, Zamiast tworzyć strukturę opisującą punkt, za każdym razem korzystając ze słowa kluczowego struct, utwórzmy nowy typ: typedef struct [punk-]

{


typedef - nazywanie typu

C udostępnia mechanizm umożliwiający nadawanie nowych nazw typom danych. Siuży do tego słowo kluczowe typedef. Mechanizmu tego używaliśmy* nieświadomie już w drugiej części kursu, korzystając z pliku <inttypes.h>. W ten sposób dołączaliśmy do naszego programu deklaracje jak niżej: typedef signed char intst; typedef unsigned char uint8_r; typedef long inti6 ti Jest to przykład prostego nadania nazwy typom. Przyporządkowujemy nowe nazwy typom podstawowym. Zapis taki jak wyżej jest praktycznie równoważ-signed char

• } punkt;

W ten sposób tworzymy nowy typ zmiennej o nazwie PUNKT. Opcjonalne pole [punki] ma dokładnie takie samo znaczenie jak miało w przypadku struktury. Zgodnie z moimi próbami umieszczona w tym miejscu etykieta może być identyczna z nazwą nowego typu, a kompilator będzie wiedział zawsze, co mamy na myśli poprzez kontekst, Nie udało mi się jednak znaleźć oficjalnego potwierdzenia tego faktu.

Uwaga. Samo umieszczenie słowa typedef przed

poprzedniej ramce, gdy tylko po zamknięciu klamry

void ObslozPr

gim przypadku tworzony jest jedynie nowy typ danej. Nic będziemy mieli z tego żadnej korzyści, dopóki z niego nie skorzystamy.

Teraz całą strukturę typu PUNKT możemy utwo-

PUNKT punktC ="{1,2,3};

Można pokazać przykład, gdzie wykorzystanie słowa itdeflne do nadania nazwy typu byłoby znacznie utrudnione. Pamiętasz naszą rozmowę o wskaźnikach na funkcję? Możesz zajrzeć w tym celu do części 4 kursu. Mamy możliwość nadania nazwy typowi będącemu wskaźnikiem na funkcję (specjalnie oznaczyłem nazwę nowego typu na czerwono): typedef VOid(*MyFuncPt;r) (uintlć_t) ;

Następnie utworzenia zmiennej będącej wskaźnikiem na funkcję:

MyFuncPtr moja_f;

Albo wykorzystania nowej nazwy typu do wygodnego zapisania jednego z parametrów: zyciskfuint8_t maska, MyFuncPtr proc)

iorld!\r\n“), 4g_fRS);


WinAVR jest prograr


lony? Aby się tego dowiedzieć, poszukujemy miejsca, gdzie została ona zdeklarowana. Znajdziesz ją w pliku C:\WinAVR\avr\inclu-de\stdio.h. Interesujący nas fragment przedstawiłem na listingu 62. Zauważ, że FILE jest zdefiniowane tutaj jako stała symboliczna,

ABC... C

deklaracja niekompletna

Ody spotkamy się z zapisem jak poniżej:

Struct Etykieta Przykładowo:

Struct Nazwa* pSl;

[ Funkcja(struct Nazwa* pS2)

I jeśli etykieta Nazwa nie była poprzednio zdeklarowana, mamy do czynienia z typem niekompletnym. W takim przypadku kompilator wic jedynie, żcpSl jest wskaźnikiem na jakąś strukturę. Nie wie o niej nic ponadto. Nie zna jej składowych czy rozmiaru. Ważne jest to, żc ź typem niekompletnym możemy bardzo niewiele zrobić. W praktyce możemy korzystać jedynie ze wskaźnika do mego. Jest to możliwe, ponieważ wskaźnik na każdą strukturę będzie wygląda! lak samo. W naszym przypadku będzie to zawsze 16-bitowy adres. Uwaga: oczywiście, na takim wskaźniku operator „->” jest zabroniony. Przy powyższych założeniach, zapis jak : niżej:

Struct Nazwa Si;

jest nieprawidłowy - dostaniemy informację o błędzie, ponieważ kompilator nie wie, ile miejsca w' pamięci zająć na podaną strukturę.

Specjalno znaczenie ma w tym przypadku zapis: Struct Nazwa;

Zauważ średnik! Taka deklaracja sprawia, że etykieta Nazwa staje się etykietą nowej struktury, jednak będzie to struktura typu niekompletnego. Przypisanie takie odbędzie się także, jeśli podana etykieta byta wcześniej powiązana z jakąś inną strukturą.

Ta reguła umożliwia nam zdeklarowanie niekompletnej struktury, nawet jeśli gdzieś indziej (na przykład w innym pliku) użyliśmy już podanego identyfikatora. Dokonana zmiana będzie miała działanie jedynie lokalne (dla pliku kodu źródłowego, we wnętrzu tunkcji, we wnętrzu instrukcji złożonej... zależnie od miejsca, gdzie powyższa deklaracja się pojawi).

a nie nowy typ. Informacja o takiej możliwości znajduje się w ramce ABC... C typedef -nazywanie typu. Ciekawa rzecz dzieje się wyżej. W pierwszej z przedstawionych linii. Aby zrozumieć, z czym mamy do czynienia, zajrzyj do ramki ABC... C deklaracja niekompletna.

Okazuje się, że z naszego punktu widzenia zmienna typu FILE została utworzona w taki sposób, aby była właśnie typu niekompletnego. Od twórców WinAVR dostaliśmy do ręki jedynie narzędzie umożliwiające nam posługiwanie się uchwytami do podanej struktury. Zabezpieczyli oni się w ten sposób przed próbami jej ręcznego modyfikowania (co w C formalnie jest zabronione). Wydawałoby się, żc tajemnica FILE została przed nami dokładnie schowana. Jednakże... może nie?

Myślę, żc przynajmniej część Czytelników w tej chwili zaprotestuje. Jeśli nie umknęła Ci sprawa, o której zaraz napiszę - bardzo się cieszę.

int main(void)

ypu FILE w pliku <stdio.h-

struct filc

rem na licencji Open Sour-ukryć w takim przypadku, a w stosunku do programów

Nie przestrasz się tego, jak głęboko w nasze narzędzia chcę Cię teraz zaprowadzić. Przekonasz się zaraz, że poszukiwanie potrzebnych nam informacji w kodzie wcale nie jest takie (rudne jakby się wydawało. Poza tym, w tej chwili, niejako „przeprowadzę Cię za rękę”, pokazując krok po kroku sposób odnalezienia oraz wykorzystania potrzebnych informacji.

Korzystamy z możliwości, jakie daje Open Source:

Jeśli masz teraz taką możliwość, wejdź na Stronę projektu: winavr.sourcefoge.nel. Spójrz na rysunek 43. Nie śpiesz się z przechodzeniem przez proponowane strony. Gdyby ważna była jedynie strona końcowa, mógłbyś przecież wpisać w okno przeglądarki bezpośrednio: www.nongnu.org/avr-Iihc. Na pierwszej stronie znajdziesz pasek z zespołem linków. W tej chwili interesuje nas link [Package]. Znajdziesz pod nim informacje o elementach wchodzących w skład WinAVR. Nie jest to jednolity pakiet tworzony tylko przez jedną grupę ludzi. Najbardziej chyba interesujące są trzy pierwsze pozycje. Na pozycji drugiej znajduje się kompilator GCC, generuje on kod, który może być przekształcony na kod maszy-_ nowy za pomocą narzędzi widocznych na pozycji pierwszej - znajduje się tam, przede wszystkim, linker oraz kompilator asemblera.

Występujące w ANS1 C biblioteki standardowe, stworzone specjalnie z myślą o procesorach AVR, znajdują się pod nazwą avr-libc. Po tej nazwie możesz znaleźć sporo informac-ji za pomocą wyszukiwarki internetowej.

Elektronika dla Wszystkich Marzec 2006 39


Wyszukiwarka

Podobne podstrony:
cz8 Programowanie ie pobiera albo ni inny wskaźnik. Więcej nawet. O ile normalnie nie wolno, bez rz
IMG 14 został „przykrojony" odpowiednio do zakresu programu. Natomiast mniej lub bardziej obsze
cz8 Programowanie Programowanie ABC... C Zamieszanie z puts i gets W praktyce większość funkcji pos
cz8 Programowanie Znamy już przyczynę problemu. Jak go rozwiązać? W posiadanej przez nas wersji Jak
cz8 Programowanie Rys. 43 Poszukiwanie źródeł bibliotek standardowych. Wybierając odnośnik avr-libć
cz8 Programowanie niem naszego wskaźnika na wskaźnik na strukturą typu niekompletnego.
cz8 Programowanie I Listing 68 ■ fcheat_iPodsumowanie rozwiązania Możesz uznać teraz, że C jest str
cz8 Programowanie Programowanie ■.onego zakresu uwiązanie
Socjologia - ukryły program. I 1.    Ukryty program (def.) - to wszystko, co zostgaje
scan0007 Roolizocjo programów PR ni wyniki baduA testowych przeprowadzonych przez niezależne organiz
Geodezja i Kartografia a w bardziej rozbudowanych odbiornikach: •    wyświetlanie ma
s329 Programy obróbki grafiki i multimediów 329 Rozszerzenie Typ formatu Program konwersji .
s331 Programy obróbki grafiki i multimediów 331 Rozszerzenie Typ formatu Program
SDC11388 Bardziej rozbudowana jest typologia Slatera, który wyróżnia osiem typów postaw, opierając s

więcej podobnych podstron