Programowanie
Programowanie
■.onego zakresu uwiązanie zup,
u32a;
///////////////////////////////////////////////
// inicjacja portu szeregowego
/////////////////////////////////////////////// fputs_p(psTRC„START\r\n''). ras);
u8a - 100;
u8b - 200;
u8a = (u8b * u8a) / 100;
fptintć p(fRS, pstr(„8x8 wynik: %u\r\n”),
(unsigned int)u8a);
u!Ga = 200; u!6b = 600;
ul6c = Cui6a * ul6b) / 10; fprinrt^p(ERS, pstr(„16x16 Wynik: Xu\r\n"), (unsigned int)u!6c);
ui6o - (-jint32_t)Cul6a * ul6b) / 10;
-fprintf p(fRS, p:;tk(„ (32) (16x16) wynik: %u\r\n"), (unsigned int)ui6c);
cl6c = C(uinC32 c)ul6a * (j-lr.-32_t)ul6b) / 10; iprintf p(fR5, PSTr(„(32)16x(32)16 Wynik: Xu\r\n").
(unsigned intjclfcc); ulćc = ((uint32_t)ul6a * a!6b) / 10; fprintf p(fRS, PSTSC,(32)16x16 Wynik: %u\r\n"), (unsigned int)ui6c); u32a = a 16a * ul6b;
fprintf p(fRS, PSTR(„32=16x16 wynik: aflu\r\n"), (unsigned long int)u32a);
u32a = (uint32_t)ul6a * ul6b;
fprintf P(fRS, i'STR(„32=C32) 16x16 Wynik: *lu\r\n"), (unsigned long int)u32a);
£puts_P(PSTR(„KONIEC\r\n“). fRS);
pierwsza,
Rzutowanie
Poruszyliśmy dziś trudny temat. Na zakończenie zajmiemy się czymś, co przy naszych aktualnych możliwościach powinno być proste i przyjemne. Znając już funkcją printf (oraz jej odpowiednik: fprintf), uzyskaliśmy narzędzie umożliwiające nam wykonanie eksperymentów dotyczących rzutowania. Mamy teraz całą komputerową konsolę do wyświetlania wyników ;).
i rsjget)
f •' •• '• •
Rys. 45 Wynik działania programu z listingu 70.
kopii fcheat Jile. Jest to działanie bardzo proste. Mam jednocześnie znakomitą informacją dla wszystkich chcących uniknąć konieczności stosowania takich sztuczek w przyszłości.
Problem, o którym pisaliśmy, zauważyło więcej użytkowników WlnAYR. Niecały tydzień przed oddaniem tego tekstu do składu nowa wersja jest już dostępna i problem, z którym dziś walczyliśmy, został tam rozwiązany. Rozwiązanie to jest dość podobne do zaproponowanego tutaj, tak więc zdobyta wiedza ułatwi zrozumienie wprowadzonych
Mimo wszystko opisane działanie było znakomitym pretekstem do pokazania kodów źródłowych naszego środowiska oraz głębszego zapoznania się z wewnętrzną zasadą działania strumieni.
.isring 69 If'pływ ograni. o przebieg obliczeń oraz
#incłude <avr/io.h> #inc1ude <stdio.h> #include <avr/pgmspace.
śHnclude „harddef.h" #inc1ude „fcheat_stdio.
Lnt32 t
Rzutowanie wskaźnika powinno być prostsze do zrozumienia niż przedstawione poprzednio rzutowanie zakresu zmiennej. Pamiętać musimy, że działanie takie ma sens jedynie między wskaźnikami na obiekty które mają między sobą coś wspólnego. Spójrz na listing 70. Jest to kolejna modyfikacja ostatniego programu, która umożliwia wypróbowanie, jak działa rzutowanie wskaźników. Wskaźnik traktowany jest idowc umieszczone są w pamięci w taki składowa o nazwie a pojawia się jako a składowa o nazwie d jako ostatnia.
ABC... C Rzutowanie - konwersja zakresu wartości zmiennej oraz ABC... C Rzutowanie wskaźnika, przedstawiają obiecane od pewnego już czasu informację o tym, jak dokładniej działa rzutowa-
Strukiura odwrotna odwraca tę kolejność oraz posiada o jedno pole mniej. Spójrz na rysunek 45 wynik działania naszego programu. Zauważ, jaki efekt daje dostęp za pomocą wskaźnika typu odwrotna do obszaru pamięci zajmowanego przez strukturę nl typu normalna. Łatwo zauważyć, że do składowej d zawartej w nl nic jesteśmy w stanie w ogóle dostać sic poprzez wskaźnik poi. Składowe struktury umieszczane będą w pamięci w kolejności, na jakie wskazuje kolejność ich deklarowania. Nie ma to nic wspólnego z ich nazwą.
Uwaga. Nawet gdyby obie struktury z listingu 70 były identyczne, dla kompilatora i tak są to dwa różne typy danych. Oznacza to, że przy kopiowaniu ich wskaźników niezbędne jest rzutowanie albo na typ docelowy (jak na listingu 67), albo poprzez wskaźnik typu void (jak na listingu 68).
nie i do czego służy.
Poeksperymentuj z kodami z listingów 69 oraz 70 obrazujących wykorzystanie obu typów rzutowania.
Jeśli wciąż masz wątpliwości, jak działa łańcuch formatowania
w funkcji printf, ram- _
ka Kilka dodatkowych słów o p rintf być może rozwieje Two-jc wątpliwości. Spróbuj wrócić do poprzedniej części, gdzie pojawił się dokładny opis tworzenia odpowiedniego opisu dołączanych do printfa argumentów.
Na koniec, w ostatniej już ramce, przedstawiam dodatkowe informacje o wskaźniku na typ pusty. Nazwa brzmi być może poważniej, niż sprawa naprawdę wygląda. Ramka wyjaśnia między innymi sens kodu z listingu 68.
Listing 70 Rzutowanie wskaźników.
typedef struct normalna
int m&ir, (voi d)
normalna nl;
odwrotna* no i = (cdwrotna*)4m I; /////////////////////////////// // inicjacja portu szeregowego (...)
// Koniec inicjacji /////////////////////////////// Ipurs_P(PSTR(”START\r\n”), fRS);
fprintl_p(fRS,
PSTR("odwrotna:\r\na=Xd\r\nb=*d\r\nc=%d\r\n”), (int)poi->a, (int)poi->b, (int)poi->c);
rputs_p(?siR("KONiEC\r\n”)1 fRS);
Elektronika dla Wszystkich Marzec 2006 W1