Struktury, unie, wyliczenia oraz typedef

Podobne dokumenty
Struktury - wprowadzenie

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Język C zajęcia nr 11. Funkcje

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Wstęp do programowania 1

Zmienne, stałe i operatory

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Tablice, funkcje - wprowadzenie

KURS C/C++ WYKŁAD 6. Wskaźniki

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Różności w C++ Marek Pudełko

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Lab 9 Podstawy Programowania

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy programowania w języku C++

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

external Data Representation

Struktury czyli rekordy w C/C++

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Program w C. wer. 12 z drobnymi modyfikacjami! Wojciech Myszka :59:

Wskaźniki. Programowanie Proceduralne 1

Struktury Struktura polami struct struct struct struct

C-struktury wykład. Dorota Pylak

Algorytmy i struktury danych. wykład 1

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Programowanie Proceduralne

Sun RPC/XDR. Dariusz Wawrzyniak 1

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

C-struktury wykład. Dorota Pylak

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

external Data Representation

Szablony. Szablony funkcji

Struktury, unie, formatowanie, wskaźniki

6 Przygotował: mgr inż. Maciej Lasota

Uzupełnienie dot. przekazywania argumentów

Wskaźniki w C. Anna Gogolińska

Podstawy programowania w języku C i C++

Język ludzki kod maszynowy

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Programowanie strukturalne i obiektowe

Języki i metodyka programowania. Wskaźniki i tablice.

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Struktury. Przykład W8_1

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Języki programowania - podstawy

MATERIAŁY DO ZAJĘĆ II

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania. Wykład 2 Zmienne i obsługa wejścia/wyjścia. Krzysztof Banaś Podstawy programowania 1

ZASADY PROGRAMOWANIA KOMPUTERÓW

Funkcja (podprogram) void

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Programowanie Komputerów

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Wstęp do programowania

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Typy danych. Przemysław Gawroński D-10, p lutego Wykład 1. (Wykład 1) Typy danych 25 lutego / 11

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Programowanie Proceduralne

tablica: dane_liczbowe

Języki i paradygmaty programowania

dr inż. Jarosław Forenc

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Wstęp do Programowania, laboratorium 02

Biblioteka standardowa - operacje wejścia/wyjścia

2 Przygotował: mgr inż. Maciej Lasota

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Laboratorium 5: Tablice. Wyszukiwanie binarne

Podstawy programowania skrót z wykładów:

Programowanie obiektowe

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podstawy Informatyki. Metalurgia, I rok. Wykład 3 Liczby w komputerze

Stałe, tablice dynamiczne i wielowymiarowe

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Stałe i zmienne znakowe. Stała znakowa: znak

Wskaźniki. Informatyka

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Transkrypt:

Struktury, unie, wyliczenia oraz typedef Przemysław Gawroński D-10, p. 234 Wykład 7 12 kwietnia 2019 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 1 / 33

Outline 1 Wskaźniki do struktur 2 C99 - elastyczne składowe tablicowe 3 C99 - inicjatory desygnowane 4 C11 - struktury i unie anonimowe 5 Unie 6 Wyliczenia 7 Pola bitowe 8 typedef (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 2 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: przekazywania struktur do funkcji przez referencję, (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: przekazywania struktur do funkcji przez referencję, tworzenia dynamicznych struktur danych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: przekazywania struktur do funkcji przez referencję, tworzenia dynamicznych struktur danych. Przekazując strukturę do funkcji tworzona jest jej kopia na stosie. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: przekazywania struktur do funkcji przez referencję, tworzenia dynamicznych struktur danych. Przekazując strukturę do funkcji tworzona jest jej kopia na stosie. Gdy funkcja otrzymuje wskaźnik do struktury tylko adres struktury umieszczany jest na stosie. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur Ogólna postać deklaracji wskaźnika do struktury: struct etykieta *nazwa-zmiennej; Wskaźniki do struktur służą do: przekazywania struktur do funkcji przez referencję, tworzenia dynamicznych struktur danych. Przekazując strukturę do funkcji tworzona jest jej kopia na stosie. Gdy funkcja otrzymuje wskaźnik do struktury tylko adres struktury umieszczany jest na stosie. Funkcja może operować bezpośrednio na strukturze, a nie na jej kopii. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 3 / 33

Wskaźniki do struktur struct critter { const char * name ; const char * species ; }; struct critter muppets [] = { {" Kermit ", " frog "}, {" Piggy ", " pig "} }; void print_critter ( const struct critter * c){ printf ("%s, the %s\n", c->name, c-> species ); } print_critter (& muppets [0]) ; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 4 / 33

Wskaźniki do struktur int critter_cmp ( const void * c1, const void * c2){ return strcmp ( ( ( struct critter *) c1 ) - > name, ( ( struct critter *) c2 ) -> name ); } int cnt = sizeof ( muppets ) / sizeof ( struct critter ); qsort ( muppets, cnt, sizeof ( struct critter ), critter_cmp ); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 5 / 33

Wskaźniki do struktur struct critter * find_critter ( const char * name, struct critter * muppets, int cnt ){ struct critter target ; target. name = name ; } return bsearch (& target, muppets, cnt, sizeof ( struct critter ), critter_cmp ); struct critter * result = find_critter (" Kermit ", muppets, cnt ); if( result ) print_critter ( result ); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 6 / 33

Struktury - wyrównywanie granic struct cic { char a; // 1 int b; // 4 char c; /* 1 */ }; struct icc { int b; // 4 char a; // 1 char c; /* 1 */ }; struct cci { char a; // 1 char c; // 1 int b; /* 4 */ }; printf ("%ld\n", sizeof ( struct cic )); // 12 printf ("%ld\n", sizeof ( struct icc )); // 8 printf ("%ld\n", sizeof ( struct cci )); // 8 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 7 / 33

Struktury - wyrównywanie granic size t offsetof(type, member) - makro z nagłówka stddef.h, określa przesuniecie member w stosunku do type, gdzie type to struktura bądź unia. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 8 / 33

Struktury - wyrównywanie granic size t offsetof(type, member) - makro z nagłówka stddef.h, określa przesuniecie member w stosunku do type, gdzie type to struktura bądź unia. struct cci { char a; // 1 char b; // 1 int c; // 4 } z; // Typ int zajmuje 4 bajty i musi zaczynac sie od adresu podzielnego przez 4. printf ("%ld\n", sizeof ( struct cci )); // 8 printf ("%p %p %p\n", &z.a, &z.b, &z.c); // 0 x7fffd65214a0 0 x7fffd65214a1 0 x7fffd65214a4 printf ("a=% ld\n",offsetof ( struct cci,a));// 0 printf ("b=% ld\n",offsetof ( struct cci,b));// 1 printf ("c=% ld\n",offsetof ( struct cci,c));// 4 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 8 / 33

Struktury - wyrównywanie granic struct icc { int a; // 4 char b; // 1 char c; // 1 } y; printf ("%ld\n", sizeof ( struct icc )); // 8 printf ("%p %p %p\n", &y.a, &y.b, &y.c); // 0 x7fff09860fb0 0 x7fff09860fb4 0 x7fff09860fb5 printf ("a=% ld\n",offsetof ( struct icc,a));// 0 printf ("b=% ld\n",offsetof ( struct icc,b));// 4 printf ("c=% ld\n",offsetof ( struct icc,c));// 5 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 9 / 33

Struktury - wyrównywanie granic struct cic { char a; // 1 int b; // 4 char c; // 1 } x; printf ("%ld\n", sizeof ( struct cic )); // 12 printf ("%p %p %p\n", &x.a, &x.b, &x.c); // 0 x7fff09860fc0 0 x7fff09860fc4 0 x7fff09860fc8 printf ("a=% ld\n",offsetof ( struct cic,a));// 0 printf ("b=% ld\n",offsetof ( struct cic,b));// 4 printf ("c=% ld\n",offsetof ( struct cic,c));// 8 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 10 / 33

C99 - elastyczne składowe tablicowe Standard C99 pozwala zadeklarować tablicę o nieokreślonym rozmiarze jako ostatnią składową struktury. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 11 / 33

C99 - elastyczne składowe tablicowe Standard C99 pozwala zadeklarować tablicę o nieokreślonym rozmiarze jako ostatnią składową struktury. Struktura musi zawierać co najmniej jeden element przed elastyczna składową tablicową. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 11 / 33

C99 - elastyczne składowe tablicowe Standard C99 pozwala zadeklarować tablicę o nieokreślonym rozmiarze jako ostatnią składową struktury. Struktura musi zawierać co najmniej jeden element przed elastyczna składową tablicową. Taka składowa umożliwia umieszczenie w strukturach tablic o zmiennej długości. Rozmiar takiej struktury zwrócony przez operator sizeof nie uwzględnia pamięci przeznaczonej na taką tablicę. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 11 / 33

C99 - elastyczne składowe tablicowe Standard C99 pozwala zadeklarować tablicę o nieokreślonym rozmiarze jako ostatnią składową struktury. Struktura musi zawierać co najmniej jeden element przed elastyczna składową tablicową. Taka składowa umożliwia umieszczenie w strukturach tablic o zmiennej długości. Rozmiar takiej struktury zwrócony przez operator sizeof nie uwzględnia pamięci przeznaczonej na taką tablicę. Przykład. struct mys { int a; float fa []; }; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 11 / 33

C99 - elastyczne składowe tablicowe Standard C99 pozwala zadeklarować tablicę o nieokreślonym rozmiarze jako ostatnią składową struktury. Struktura musi zawierać co najmniej jeden element przed elastyczna składową tablicową. Taka składowa umożliwia umieszczenie w strukturach tablic o zmiennej długości. Rozmiar takiej struktury zwrócony przez operator sizeof nie uwzględnia pamięci przeznaczonej na taką tablicę. Przykład. struct mys { int a; float fa []; }; Przydział pamięci dla struktury zawierającej 10 elementową tablicę. struct mys * p = malloc ( sizeof ( struct mys ) + 10* sizeof ( float ) ); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 11 / 33

C99 - inicjatory desygnowane Inicjatory desygnowane występują w dwóch odmianach: (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 12 / 33

C99 - inicjatory desygnowane Inicjatory desygnowane występują w dwóch odmianach: dla tablic [indeks]=val, (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 12 / 33

C99 - inicjatory desygnowane Inicjatory desygnowane występują w dwóch odmianach: dla tablic [indeks]=val, dla struktur.nazwa-składowej=val. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 12 / 33

C99 - inicjatory desygnowane Inicjatory desygnowane występują w dwóch odmianach: dla tablic [indeks]=val, dla struktur.nazwa-składowej=val. Przykład. int a [10]= {[0]=100, [3]=200}; struct strm { int a; int b; int c; } ob = {.c=30,.a =10}; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 12 / 33

C11 - struktury i unie anonimowe Struktury i unie anonimowe: struct foo { int m; struct { float x; int n; }; }; struct foo t; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 13 / 33

C11 - struktury i unie anonimowe Struktury i unie anonimowe: struct foo { int m; struct { float x; int n; }; }; struct foo t; Bezpośredni dostęp do pola struktury anonimowej: t.n = 1300; t.m = 2300 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 13 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia różną interpretację tej samej wartości binarnej (nietypowe zaokrąglenia), (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia różną interpretację tej samej wartości binarnej (nietypowe zaokrąglenia), tworzenie złożonych typów danych, jednocześnie oszczędzając miejsce w pamięci. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia różną interpretację tej samej wartości binarnej (nietypowe zaokrąglenia), tworzenie złożonych typów danych, jednocześnie oszczędzając miejsce w pamięci. Ogólna postać deklaracji unii: union [ etykieta ]{ typ pole_unii ; }[ lista - zmiennych ]; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia różną interpretację tej samej wartości binarnej (nietypowe zaokrąglenia), tworzenie złożonych typów danych, jednocześnie oszczędzając miejsce w pamięci. Ogólna postać deklaracji unii: union [ etykieta ]{ typ pole_unii ; }[ lista - zmiennych ]; union u_ type { int i; //4 bajty - int. char ch; // 1 bajt - char. } u; // cala unia zajmuje TYLKO 4 bajty. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie Unia to obszar w pamięci, który współdzieli kilka zmiennych różnego typu. Unia umożliwia różną interpretację tej samej wartości binarnej (nietypowe zaokrąglenia), tworzenie złożonych typów danych, jednocześnie oszczędzając miejsce w pamięci. Ogólna postać deklaracji unii: union [ etykieta ]{ typ pole_unii ; }[ lista - zmiennych ]; union u_ type { int i; //4 bajty - int. char ch; // 1 bajt - char. } u; // cala unia zajmuje TYLKO 4 bajty. Dostęp do składowych unii umożliwiają operatory kropka i strzałka. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 14 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) Algorytm wyznacza 1 w następujących krokach: x (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) Algorytm wyznacza 1 w następujących krokach: x zmiennoprzecinkowy wartość x interpretowana jest jako liczba całkowita, co może być sposobem na wyznaczenie przybliżenia log 2 (x) (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) Algorytm wyznacza 1 w następujących krokach: x zmiennoprzecinkowy wartość x interpretowana jest jako liczba całkowita, co może być sposobem na wyznaczenie przybliżenia log 2 (x) wyliczone przybliżenie zostaje przekształcone w przybliżoną wartość log 2 ( 1 x ) = 1 2 log 2(x) (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) Algorytm wyznacza 1 w następujących krokach: x zmiennoprzecinkowy wartość x interpretowana jest jako liczba całkowita, co może być sposobem na wyznaczenie przybliżenia log 2 (x) wyliczone przybliżenie zostaje przekształcone w przybliżoną wartość log 2 ( 1 x ) = 1 2 log 2(x) otrzymana liczba całkowita interpretowana jest jako zmiennoprzecinkowa, co pozwala obliczyć przybliżenie funkcji wykładniczej o podstawie 2 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) Szybka odwrotność pierwiastka kwadratowego z 32-bitowej liczby zmiennoprzecinkowej w standardzie IEEE 754. Odwrotności pierwiastków kwadratowych są używane do obliczania kątów padania i odbicia dla oświetlenia i cieniowania w grafice komputerowej. (Quake III: Arena) Algorytm wyznacza 1 w następujących krokach: x zmiennoprzecinkowy wartość x interpretowana jest jako liczba całkowita, co może być sposobem na wyznaczenie przybliżenia log 2 (x) wyliczone przybliżenie zostaje przekształcone w przybliżoną wartość log 2 ( 1 x ) = 1 2 log 2(x) otrzymana liczba całkowita interpretowana jest jako zmiennoprzecinkowa, co pozwala obliczyć przybliżenie funkcji wykładniczej o podstawie 2 dokładność wyniku można zwiększyć stosując iteracje metody Newtona-Raphsona (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 15 / 33

Unie - 1/sqrt(x) # include <stdint.h> float Q_rsqrt_u ( float number ){ const float x2 = number * 0.5 F; union { float f; uint32_t i; } conv = { number }; conv.i = 0 x5f3759df - ( conv.i >> 1); conv.f *= (1.5 F - (x2 * conv.f * conv.f)); return } conv.f; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 16 / 33

Unie - mieszane typy danych # define INT_NUMBER 0 # define DOUBLE_NUMBER 1 struct number { union { double dvar ; int ivar ; } uvar ; char type ; }; struct number a,b; a. type = INT_NUMBER ; a. uvar. ivar =57; b. type = DOUBLE_NUMBER ; b. uvar. dvar =12.34; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 17 / 33

Unie - mieszane typy danych void print_number ( struct number tmp ){ } if ( tmp. type == INT_NUMBER ) printf (" int = %d\n", tmp. uvar. ivar ); else printf (" double = %lf\n", tmp. uvar. dvar ); print_number (a); print_number (b); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 18 / 33

Wyliczenia Wyliczenie to zbiór stałych całkowitych o określonych nazwach. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 19 / 33

Wyliczenia Wyliczenie to zbiór stałych całkowitych o określonych nazwach. Ogólna postać wyliczenia: enum [ etykieta ] { lista wartosci } [ zmienne ]; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 19 / 33

Wyliczenia Wyliczenie to zbiór stałych całkowitych o określonych nazwach. Ogólna postać wyliczenia: enum [ etykieta ] { lista wartosci } [ zmienne ]; Przykład: enum moneta { penny, nickel, dime, quarter, half_ dolar, dolar }; enum moneta x;... x = dime ; if (x == quarter )... (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 19 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. Każdy symbol otrzymuje wartość o jeden większą od wartości poprzedniego symbolu. Wartość pierwszego symbolu to zero. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. Każdy symbol otrzymuje wartość o jeden większą od wartości poprzedniego symbolu. Wartość pierwszego symbolu to zero. Można również określić wartości jednego lub kilku symboli. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. Każdy symbol otrzymuje wartość o jeden większą od wartości poprzedniego symbolu. Wartość pierwszego symbolu to zero. Można również określić wartości jednego lub kilku symboli. Przykłady: enum mnta { penny = 1, nickel = 2, dime = 3, quarter = 4, half_dolar = 5, dolar = 6}; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. Każdy symbol otrzymuje wartość o jeden większą od wartości poprzedniego symbolu. Wartość pierwszego symbolu to zero. Można również określić wartości jednego lub kilku symboli. Przykłady: enum mnta { penny = 1, nickel = 2, dime = 3, quarter = 4, half_dolar = 5, dolar = 6}; enum mntb { penny = 11, nickel = 22, dime = 13, quarter = 4, half_ dolar = 15, dolar = 66}; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Każdy symbol wyliczenia reprezentuje stałą całkowitą. Wyliczeń można używać tam gdzie można użyć liczby całkowitej. Każdy symbol otrzymuje wartość o jeden większą od wartości poprzedniego symbolu. Wartość pierwszego symbolu to zero. Można również określić wartości jednego lub kilku symboli. Przykłady: enum mnta { penny = 1, nickel = 2, dime = 3, quarter = 4, half_dolar = 5, dolar = 6}; enum mntb { penny = 11, nickel = 22, dime = 13, quarter = 4, half_ dolar = 15, dolar = 66}; enum mntc { penny, nickel = 7, dime, quarter, half_ dolar, dolar = 15}; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 20 / 33

Wyliczenia Przykład: int i; enum { CLUBS, DIAMONDS, HEARTS, SPADES } s; i = DIAMONDS ; // i = 1 s = 0; // s = 0 CLUBS s ++; // s = 1 DIAMONDS i = s + 2; // i = 3 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 21 / 33

Unie + Wyliczenia = mieszane typy danych struct number { enum { INT_ NUMBER, DOUBLE_ NUMBER } type ; union { double dvar ; int ivar ; } uvar ; }; struct number number_ tab [ 10]; number_tab [i]. type = INT_NUMBER ; number_tab [i]. uvar. ivar = rand () %125; number_tab [i]. type = DOUBLE_NUMBER ; number_tab [i]. uvar. dvar =( double ) rand ()/ RAND_MAX ; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 22 / 33

Unie + Wyliczenia = mieszane typy danych enum e_typ {BOOK, MUG }; enum e_typ {BOOK, MUG }; struct sctm { int nmbr ; double prc ; enum e_ typ type ; }; struct { char title [45]; char author [25]; int num_pages ; } book ; struct { char design [35]; } mug ; struct ctm { int nmbr ; double prc ; enum e_ typ type ; union { struct { char title [45]; char author [25]; int num_pages ; } book ; struct { char design [35]; } mug ; } item ; }; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 23 / 33

Unie + Wyliczenia = mieszane typy danych printf (" sizeof struct ctm = %lu\n", sizeof ( struct ctm )); // 96 printf (" sizeof struct sctm = %lu\n", sizeof ( struct sctm )); // 136 struct ctm rtcl [ 10]; rtcl [0]. type = BOOK ; rtcl [0]. prc = 25.99; strcpy ( rtcl [0]. item. book. title," Pantaleon y las visitadoras "); strcpy ( rtcl [0]. item. book. author," Vargas Llosa "); rtcl [1]. type = MUG ; rtcl [1]. prc = 5.99; strcpy ( rtcl [1]. item. mug. design,"in on the Kill Taker "); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 24 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. Pola bitowe pozwalają w jednym bajcie przechować kilka zmiennych logicznych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. Pola bitowe pozwalają w jednym bajcie przechować kilka zmiennych logicznych. Pola bitowe to specjalny typ składowych struktury lub unii o długości określonej w bitach. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. Pola bitowe pozwalają w jednym bajcie przechować kilka zmiennych logicznych. Pola bitowe to specjalny typ składowych struktury lub unii o długości określonej w bitach. Ogólna postać definicji pola bitowego: typ nazwa : długość; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. Pola bitowe pozwalają w jednym bajcie przechować kilka zmiennych logicznych. Pola bitowe to specjalny typ składowych struktury lub unii o długości określonej w bitach. Ogólna postać definicji pola bitowego: typ nazwa : długość; typ to int, signed, unsigned. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Język C pozwala odwoływać się do konkretnych bitów za pośrednictwem pól bitowych. Pola bitowe pozwalają w jednym bajcie przechować kilka zmiennych logicznych. Pola bitowe to specjalny typ składowych struktury lub unii o długości określonej w bitach. Ogólna postać definicji pola bitowego: typ nazwa : długość; typ to int, signed, unsigned. długość to liczba bitów. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 25 / 33

Pola bitowe Z pól bitowych często korzysta się przy analizowaniu danych pochodzących z urządzeń zewnętrznych. Port statusu karty szeregowej - 1 bajt: struct status_type { unsigned int delta_cts :1; unsigned int delta_dsr :1; unsigned int tr_edge :1; unsigned int delta_rec :1; unsigned int cts :1; unsigned int dsr :1; unsigned int ring :1; unsigned int rec_line :1; } status ; status = get_port_status (); status. ring = 0; if ( status. cts ) printf (" clear to send "); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 26 / 33

Pola bitowe Można jednocześnie umieszczać w strukturze zwykłe elementy oraz pola bitowe. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 27 / 33

Pola bitowe Można jednocześnie umieszczać w strukturze zwykłe elementy oraz pola bitowe. Można pominąć nieużywane bity: struct status_type { unsigned int : 4; // pomijamy nieuzywane unsigned int cts : 1; // interesuja nas unsigned int dsr : 1; // tylko bity 5 i 6 } status ; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 27 / 33

Pola bitowe Nie można pobrać adresu pola bitowego. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 28 / 33

Pola bitowe Nie można pobrać adresu pola bitowego. Nie można tworzyć tablic pól bitowych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 28 / 33

Pola bitowe Nie można pobrać adresu pola bitowego. Nie można tworzyć tablic pól bitowych. Pól bitowych nie można deklarować jako statycznych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 28 / 33

Pola bitowe Nie można pobrać adresu pola bitowego. Nie można tworzyć tablic pól bitowych. Pól bitowych nie można deklarować jako statycznych. Korzystanie z pól bitowych wiąże kod z konkretnym typem komputera; nie wiadomo czy pola bitowe układają się od lewej do prawej czy też odwrotnie. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 28 / 33

Pola bitowe Nie można pobrać adresu pola bitowego. Nie można tworzyć tablic pól bitowych. Pól bitowych nie można deklarować jako statycznych. Korzystanie z pól bitowych wiąże kod z konkretnym typem komputera; nie wiadomo czy pola bitowe układają się od lewej do prawej czy też odwrotnie. Kod operujący na polach bitowych jest zazwyczaj dużo jaśniejszy niż odpowiadające mu jawne operacje na maskach bitowych. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 28 / 33

Maski bitowe unsigned short int - 16 bitów, najbardziej znaczący bit to 15, a najmniej znaczący bit to 0. unsigned short int i = 0 x0000 ; // 0000 0000 0000 0000 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 29 / 33

Maski bitowe unsigned short int - 16 bitów, najbardziej znaczący bit to 15, a najmniej znaczący bit to 0. unsigned short int i = 0 x0000 ; // 0000 0000 0000 0000 Ustawianie bitu - ustawianie 4 bitu przy pomocy maski bitowej. i = 0 x0010 ; // 0000 0000 0001 0000 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 29 / 33

Maski bitowe unsigned short int - 16 bitów, najbardziej znaczący bit to 15, a najmniej znaczący bit to 0. unsigned short int i = 0 x0000 ; // 0000 0000 0000 0000 Ustawianie bitu - ustawianie 4 bitu przy pomocy maski bitowej. i = 0 x0010 ; // 0000 0000 0001 0000 i = 0 x0000 ; i = 1 << 4; // 0000 0000 0001 0000 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 29 / 33

Maski bitowe Kasowanie bitu - kasowanie 4 bitu przy pomocy maski bitowej. i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~0 x0010 ; // 0000 0000 1110 1111 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 30 / 33

Maski bitowe Kasowanie bitu - kasowanie 4 bitu przy pomocy maski bitowej. i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~0 x0010 ; // 0000 0000 1110 1111 i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~(1 << 4); // 0000 0000 1110 1111 (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 30 / 33

Maski bitowe Kasowanie bitu - kasowanie 4 bitu przy pomocy maski bitowej. i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~0 x0010 ; // 0000 0000 1110 1111 i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~(1 << 4); // 0000 0000 1110 1111 Testowanie bitu - sprawdzanie czy 4 bit jest ustawiony. if ( i & 0 x0010 )... (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 30 / 33

Maski bitowe Kasowanie bitu - kasowanie 4 bitu przy pomocy maski bitowej. i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~0 x0010 ; // 0000 0000 1110 1111 i = 0 x00ff ; // 0000 0000 1111 1111 i &= ~(1 << 4); // 0000 0000 1110 1111 Testowanie bitu - sprawdzanie czy 4 bit jest ustawiony. if ( i & 0 x0010 )... if ( i & 1 << 4)... (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 30 / 33

Maski bitowe # define BLUE 1 // bit 0 # define GREEN 2 // bit 1 # define RED 4 // bit 2 i = BLUE ; // ustawiamy bit BLUE i &= ~ BLUE ; // kasujemy bit BLUE if (i & BLUE )... // sprawdzamy bit BLUE i = BLUE GREEN ; // ustawiamy bity BLUE i GREEN i &= ~( BLUE GREEN ); // kasujemy bity BLUE i GREEN if (i & ( BLUE GREEN ))... // sprawdzamy czy bit BLUE lub GREEN jest ustawiony (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 31 / 33

typedef Używając słowa kluczowego typedef można zdefiniować nowe nazwy typów. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 32 / 33

typedef Używając słowa kluczowego typedef można zdefiniować nowe nazwy typów. Ogólna postać instrukcji: typedef typ nowa_nazwa_typu ; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 32 / 33

typedef Używając słowa kluczowego typedef można zdefiniować nowe nazwy typów. Ogólna postać instrukcji: typedef typ nowa_nazwa_typu ; Przykład: typedef float saldo ; saldo wrzesien ; typedef struct telement { int wiek ; struct telement * nast ; } element ; element * root ; // struct telement * root ; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 32 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); Deklarator, który zaczyna się od oznacza wskaźnik. Deklarator, który kończy się [] oznacza tablicę. Deklarator, który kończy się () oznacza funkcję. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); Deklarator, który zaczyna się od oznacza wskaźnik. Deklarator, który kończy się [] oznacza tablicę. Deklarator, który kończy się () oznacza funkcję. Deklaracje odczytujemy od środka. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); Deklarator, który zaczyna się od oznacza wskaźnik. Deklarator, który kończy się [] oznacza tablicę. Deklarator, który kończy się () oznacza funkcję. Deklaracje odczytujemy od środka. Jeżeli poprzedza identyfikator a [] następuje po nim, to identyfikator reprezentuje tablicę. Jeżeli poprzedza identyfikator a () następuje po nim, to identyfikator reprezentuje funkcję. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); Deklarator, który zaczyna się od oznacza wskaźnik. Deklarator, który kończy się [] oznacza tablicę. Deklarator, który kończy się () oznacza funkcję. Deklaracje odczytujemy od środka. Jeżeli poprzedza identyfikator a [] następuje po nim, to identyfikator reprezentuje tablicę. Jeżeli poprzedza identyfikator a () następuje po nim, to identyfikator reprezentuje funkcję. Możemy użyć nawiasów by zmienić priorytet [] oraz () nad. (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33

typedef Rozważmy poniższą deklarację: int *(* x [10]) ( void ); Deklarator, który zaczyna się od oznacza wskaźnik. Deklarator, który kończy się [] oznacza tablicę. Deklarator, który kończy się () oznacza funkcję. Deklaracje odczytujemy od środka. Jeżeli poprzedza identyfikator a [] następuje po nim, to identyfikator reprezentuje tablicę. Jeżeli poprzedza identyfikator a () następuje po nim, to identyfikator reprezentuje funkcję. Możemy użyć nawiasów by zmienić priorytet [] oraz () nad. Deklaracja z wykorzystaniem typedef typedef int * Fcn ( void ); typedef Fcn * Fcn_ ptr ; typedef Fcn_ ptr Fcn_ ptr_ array [ 10]; Fcn_ptr_array x; (Wykład 7) Struktury, unie, wyliczenia oraz typedef 12 kwietnia 2019 33 / 33