termín: utorok :00 (poledne) Cíle: Zadání:

Podobné dokumenty
Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Šablony, kontejnery a iterátory

map, multimap - Asociativní pole v C++.

Šablony, kontejnery a iterátory

Množina v C++ (set, multiset).

Domácí úkoly 2013/14

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Šablony funkcí a tříd (Templates) Genericita

PROGRAMOVÁNÍ V C++ CVIČENÍ

PB161 Programování v jazyce C++ Přednáška 10

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

3. týden Kontejner. 5. týden Exception safe policy. 7. týden 7.4. SAX C opendir. 9. týden Multithreaded network

Jazyk C++ II. STL knihovna kontejnery část 1

Vector datový kontejner v C++.

PB161 Programování v jazyce C++ Přednáška 3

Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 8

PB161 Programování v jazyce C++ Přednáška 4

Základy programování (IZP)

Konec a tak. PB173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 15.

Síťové programování. Berkeley sockets Zdroje. Wikipedia Google Jan Kubr

Jazyk C++ I. Šablony 2

Funkční objekty v C++.

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Hornerovo schéma. je algoritmus výpočtu hodnoty polynomu P(x) v bodě x 0. eliminuje výpočet i-té mocniny převodem na postupné násobení.

Standardní algoritmy vyhledávací.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

PB161 Programování v jazyce C++ Přednáška 3

přetížení operátorů (o)

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Programování v jazyce C a C++

Základní datové struktury

Programování v C++ 3, 3. cvičení

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Programování v C++ 1, 5. cvičení

Programování v C++ 2, 4. cvičení

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

PB přednáška (26. října 2015)

PB přednáška (23. listopadu 2015)

Jazyk C++ II. STL knihovna kontejnery část 2

Množina čísel int stl-set-int.cpp

Standardní algoritmy v C++.

Základy programování (IZP)

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

Jazyk C++, některá rozšíření oproti C

Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Úvod do programovacích jazyků (Java)

Jazyk C++ II. Šablony a implementace

Abstraktní třídy, polymorfní struktury

přetížení operátorů (o)

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

C++ objektově orientovaná nadstavba programovacího jazyka C

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Konstruktory a destruktory

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

bonus (max +2 body): bezpečné řešení v debug módu a[x][y] (a.rows()[x][y] a.cols()[x][y]) odchytávat všechny nedefinované akce

PB161 Programování v jazyce C++ Přednáška 1

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

C++ 0x aka C++11. Základním kamenem je třída std::thread

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 1

Domácí úkoly Pokročilé programování v C++ LS 2015/2016. NPRG051 Pokročilé programování v C / DÚ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Sít ová komunikace v C++

Více o konstruktorech a destruktorech

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

3. týden týden týden týden týden týden Termín DÚ: vždy úterý 9:00. Zadání DÚ 1

Programování v C++ 1, 1. cvičení

Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

Programování v C++ 2, 8. cvičení

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Základy C++ I. Jan Hnilica Počítačové modelování 18

David Bednárek Jakub Yaghob Filip Zavoral.

C++ objektově orientovaná nadstavba programovacího jazyka C

NPRG051 Pokročilé programování v C /17 Úkol 2

Rozhraní Sockets Java a C (BSD)

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

Zpracoval:

Výrazy, operace, příkazy

IUJCE 07/08 Přednáška č. 1

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Martin Flusser. December 15, 2016

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Ukazatele, dynamická alokace

Generické programování

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Mělká a hluboká kopie

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Transkript:

termín: utorok 20.3. 12:00 (poledne) Cíle: Multiplatformnost Linux/Windows 32/64bit Návrh rozhraní Korektné zastrešenie sieťového rozhrania Použitie policies Bez užití externích knihoven (napr boost) Pozor na prevody endianity Zadání: Vytvorte triedy umožňujúce prístup k TCP/UDP Socketom ako k streamom. Implementácia by mala zastrešovať všetky funkcionality network stacku

TCP Spojovaná, spoľahlivá služba Server socket, client socket Nutné naviazanie spojenia charakterizované 4icou UDP Nespojovaná, nespoľahlivá služba Len socket Nieje nutné naviazanie spojenia

TCP UDP

int main(int argc, char **argv) { struct hostent *host; /* host information */ struct in_addr h_addr; /* internet address */ if ((host = gethostbyname(argv[1])) == NULL) { fprintf(stderr, failed ); exit(1); } h_addr.s_addr = *((unsigned long *) host->h_addr_list[0]); fprintf(stdout, "%s\n", inet_ntoa(h_addr)); exit(0); } /* Create the TCP socket */ if ((sock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) {fprintf(stdout("failed to create socket"); } memset(&echoserver, 0, sizeof(echoserver)); /* Clear struct */ echoserver.sin_family = AF_INET; /* Internet/IP */ echoserver.sin_addr.s_addr = inet_addr(argv[1]); /* IP address */ echoserver.sin_port = htons(atoi(argv[3])); /* server port */ if (connect(sock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0){ fprintf(stdout,"failed to connect with server"); }

char str[] = "Test sentence"; int val = 65; char ch = 'A'; cout << str << endl; // Insert string cout << ch << endl; // Insert single character cout.width (10); cout << right; // Insert manipulator cout << val << endl; // Insert integer return 0;

Kompletné zamaskovanie funkcionality socketov Využite Funkcie i Manipulátory (viz IOstream) TCP/UDP sockety Vytváranie socketov socket, bind, accept, listen, close, shutdown Posielanie dát send/recv Možnost nastaviť či bude blokujúci alebo neblokujúci call nastavovanie príznakov Možnost namapovat fail, disconnect callback Použitie pomocou operátorov << a >> Možnosť prúdového i transakčného posielania dát Prúdové data poskytnuté steamu sú hneď odoslané Transakčné data poskytnuté streamu sú odoslané až po commite Rozpoznávanie a korektné chovanie s endianitou Možnosť nastavovania sémantických značiek Length vyplní sa automaticky pri commite

Vytváranie socketov StreamSocket<Net::TCP::Server> s( 20.20.20.20, 20); StreamSocket<Net::TCP> sc(); sc.connect( aaaa.net,8080); s.listen(20); s << StreamSocket::listen(10); s >> s2; StreamSocket<Net::UDP > s2( localhost,10); Posielanie dát s2.recv( buff, 20 ); std::vector< char > b; b.resize(20); std::vector< int > b2; b2.resize(20); s2 << Net::BlockingCalls; s2 << Net::CharBuff(20) >> s2 >> buff; s2 >> b; s2 >> b2;

Možnosť prúdového i transakčného posielania dát Prúdové sc << Net::StreamDataFlow; sc << 4 << std::string aaaaaa << Net::CharBuff(5) << bbbb ; Transakčné data poskytnuté streamu sú odoslané až po commite sc << Net::TransactionDataFlow; sc << 4 << std::string aaaaaa << Net::CharBuff(5) << bbbb ; if ( sc << Net::TransactionCommit ) { } //success Možnosť nastavovania sémantických značiek Length vyplní sa pri commite (napr 4B int) sc << PACKET_DATA << Net::Mark::Length<int> << 4 << 5 << a ; if ( sc << Net::TransactionCommit ) { } //success

Jednotné OO rozhraní nevázané na konkrétní platformu Čistá a hezká syntaxe i sémantika Typy parametrů a návratových hodnot Ošetření výjimečných a chybových stavů Korektní stavové chování Bezwarningová zkompilovatelnost Včastnost odevzdání

Thead safe Inteligent dizajn based on policies

Pouze přes Grupík Vše v jednom.zip souboru do sloupečku DU1 za poslání nevhodného obsahu budou strhnuty body na začátek každého souboru vložte komentář typu // DU1-SS.cpp // Karel Vomacka NPRG051 2011/2012

termín: úterý 3.4 12:00 (poledne) Cíle: Vlastní kontejnery C++0x rvalue reference, move sémantika Multiplatformnost Zadání: Vytvořte kontejner, který minimalizuje zbytečné kopírování pomocí C++0x rvalue referencí a strukturu, která tohle pole bude obsahovat a bude mít v něm uloženy prvky.

vložení, smazání prvku, smazání všech prvků, základní iterátor konstruktory (default, iterator begin/end, size/init value, ) jednoduchý alokátor operator [] operator= swap poskytovat typy ( value_type, iterator, pointer, difference_type, const*) nepoužívat cizí datové struktury parametrizace minim. typem prvku a alokátorem (s default hodnotou)

konstruktor (default, iterator begin/end, size/init value, ) operator+ matematicky, jednoduchý sčítaní dvou vektorů různe velikosti doplnit 0 prvek bude podporovat operator+ operator= operator<< výpis poskytovat typ container_type parametrizace min. typem prvku

jednoduše přepínat mezi efektivní/neefektivní implementací makra, politika,... porovnat rychlost s std::vector

// e.g., #define WITH_RVALUES... int main( int argc, char* argv[] ) { tester::test_adder< uloha2::adder >(); return 0; } namespace tester {... test_adder() { typedef int elem_type; typedef adder<elem_type> adder_type; // start timer { // adder_type fun... } } } // namespace

// fun with adder adder_type ret; for ( size_t i = 0; i < CYCLE_COUNT; ++i ) ret = ret + adder_type<int>( first, last );

Čistá a hezká syntaxe i sémantika Typy parametrů a návratových hodnot Ošetření výjimečných a chybových stavů Bezwarningová zkompilovatelnost Včastnost odevzdání Stl-like

Optimální použití r-values a swapů Vícero implementací kopírování Analýza proč je váš kontejner pomalejší/rychlejší jako stl

Pouze přes Grupík Vše v jednom.zip souboru do sloupečku DU2 Názvy zdrojáků (povinně): du2_adder.h du2_tester.h du2_main.cpp Posílejte pouze zdrojové soubory a neposílejte žádné makefile,.prj,.sln,.obj,.exe,.pdb a jakékoliv další vedlejší soubory za poslání nevhodného obsahu budou strhnuty body na začátek každého souboru vložte komentář typu // DU2-ADDER // Karel Vomacka NPRG051 2011/2012

termín: úterý 17.4. 9:00 Cíle: šablony, specializace, politiky práce s kontejnery a iterátory eliminace copy-and-paste Zadání: vytvořte šablonu cache pro základní knihovní kontejnery vector, deque, list, set, map, multiset, multimap operace: add, remove, search, clear

myšlenka eliminace časově náročných operací u velmi velkých kontejnerů velikost cache pevný počet záznamů (nepovinný) parametr šablony s defaultní hodnotou (20) hledání při nalezení hodnoty v cache se již kontejner neprohledává při nalezení hodnoty v kontejneru se hodnota přidá do cache zaplněná cache při přidávání do zaplněné cache vyhodit vhodnou položku defaultně nejdéle nepřistupovanou položku funktor definující chování jako (nepovinný) parametr šablony další poznámky při mazání nezapomenout na cache pozor na validnost iterátorů nepředpokládá se jiný přístup do kontejneru než přes cache

cache< vector< string> > vs; vs.add( "kzr"); vs.add( "pzr"); vector< string>::const_iterator s = vs.search( "kzr"); typedef map< int, int> mii_t; template <????> class fcch???; cache< mii_t, 20, fcch > mi; mi.add( make_pair( 10, 3)); mi.add( make_pair( 5, 2)); mi.add( make_pair( 7, 4)); mi.remove( 2); mii_t::const_iterator i = mi.search( 3); funktor (nebo něco podobného) co dělá cache při přeplnění návrh rozhraní ponechán na řešiteli

korektní funkčnost pro všechny požadované kontejnery vector, deque, list, set, map, multiset, multimap čistá a hezká syntaxe i sémantika elegantnost rozhraní modifikačního funktoru absence copy-and-paste bezwarningová zkompilovatelnost komentáře, zejména k rozhraní včasnost odevzdání

pouze přes Grupík vše v jednom.zip souboru do sloupečku DU3 pouze zdrojáky (*.cpp. *.h) separátně knihovna a použití demo různých funktorů za poslání nevhodného obsahu budou strhnuty body *.dbg, *.obj,... na začátek každého souboru vložte komentář typu // DU3-Cache.cpp // Karel Vomacka NPRG051 2011/2012 při pozdějším odevzdání upozornit mailem cvičitele bodová penalizace

termín: úterý 1.5. 12:00 Cíle: vlákna, synchronizace některé nové vlastnosti C++ šablony, specializace, politiky Zadání: Napište knihovnu, která umožní asynchronně spouštět kód funktorů

Příklad použití knihovny: scheduler<politika> sched; auto task = sched.run([](){ return 1+1; }); std::cout << task->get_result() << std::endl; Třída scheduler má pouze jednu veřejnou metodu run, která pustí vyvolá zadaný funktor v pracovním vláknu task má pouze jednu veřejnou metodu get_result, která má stejný návratový typ, jako operátor() volaného funktoru Metoda počká, dokud nedoběhne výpočet funktoru a poté vrátí jeho výsledek Typ proměnné task může být libovolný (musí mít zmíněnou metodu), ale měl by být jednoduchý a dobře definovaný, aby jej bylo možné používat např. v kontejnerech apod. Destruktor třídy scheduler musí být korektně implementovaný, tj. počká se, dokud se nevyhodnotí všechny funktory a teprve pak se uvolní veškeré zdroje

Třída scheduler spravuje množinu pracovních vláken a předává jim funktory k vykonání Vytváření a rušení vláken je řízeno následujícími politikami: thread_pool<int N> Je vytvořeno N pracovních vláken pro vyhodnocování funktorů, pokud není žádné pracovní vlákno volné, vyhodocení počká, dokud se některé vlákno neuvolní. one_thread_per_task<int N> Pro každý funktor je vytvořeno jedno vlákno, které zanikne po vyhodnocení funktoru, maximální počet zároveň běžících je omezen číslem N. one_thread_per_task_with_delay<int N, int milliseconds> Pro každý funktor je vytvořeno jedno vlákno, které zanikne až milliseconds milisekund po vyhodnocení funktoru. Pokud během této doby přijde nový požadavek na vyhodnocení funktoru, použije se toto vlákno

Pro práci s vlákny a jejich vzájemnou synchronizaci je nutné použít přímo volání operačního systému Windows, POSIX Veškeré alokované zdroje je nutné korektně uklidit Korektní synchronizace Každý funktor musí být vykonaný právě jednou, apod.

Musí být knihovna multiplatformní? Pro zisk 10 bodů stačí, pokud bude podporovat jednu platformu (Windows/POSIX). Za multiplatformnost je možné získat 3 bonusové body. Je nutné dodržet rozhraní a názvy metod/politik? Ano, je to nutné. Představte si, že se jedná o vývoj na zakázku. Nedodržení bude stát 4 body. Skrývají se v zadání nějaká úskalí? Ano, minimálně jedno Funktory vracející typ void. Za cenu 2 bodů je ale knihovna nemusí podporovat. Můžeme si implementaci nějak usnadnit? Můžete předpokládat, že vytvoření vlákna/synchronizačního primitiva se vždy podaří. Funktor nikdy neskončí výjimkou a standardní kontejnery mají dostatek paměti. Vlákna jsou vzájemně nerozlišitelná.

korektní funkčnost pro všechny požadované politiky čistá a hezká syntaxe i sémantika elegantnost rozhraní pro třídy implementující politiky absence copy-and-paste bezwarningová zkompilovatelnost komentáře, zejména k rozhraní včasnost odevzdání

pouze přes Grupík vše v jednom.zip souboru do sloupečku DU4 pouze zdrojáky (*.cpp. *.h) v souboru main.cpp bude ukázka použití knihovny za poslání nevhodného obsahu budou strhnuty body *.dbg, *.obj,... na začátek každého souboru vložte komentář typu // DU4-Scheduler.cpp // Karel Vomacka NPRG051 2011/2012 při pozdějším odevzdání upozornit mailem cvičitele bodová penalizace