PB071 Principy nízkoúrovňového programování

Podobné dokumenty
PB071 Programování v jazyce C Jaro 2017

PB071 Programování v jazyce C Jaro 2015

PB071 Programování v jazyce C

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

PB071 Programování v jazyce C Jaro 2013

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

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

Základy programování 2 KMI/ZP2

Základy programování (IZP)

Struktura programu v době běhu

Základy programování (IZP)

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

Základy programování (IZP)

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Př. další použití pointerů

Operační systémy. Cvičení 4: Programování v C pod Unixem

Ukazatele #2, dynamická alokace paměti

Opakování programování

Ukazatele, dynamická alokace

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

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

Úvod do programovacích jazyků (Java)

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

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Práce s polem a pamětí

Práce s pamětí a předávání parametrů. Úvod do programování 1

PB071 Programování v jazyce C

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

Více o konstruktorech a destruktorech

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Ukazatele, paměťové třídy, volání funkcí

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

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

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

Programovací jazyk C++ Hodina 1

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

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

ISU Cvičení 7. Marta Čudová

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

5 Přehled operátorů, příkazy, přetypování

Pointery II. Jan Hnilica Počítačové modelování 17

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

Operační systémy. Cvičení 3: Programování v C pod Unixem

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

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

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

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

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

Základy programování (IZP)

Výrazy, operace, příkazy

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

Spojová implementace lineárních datových struktur

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

NMIN102 Programování /2 Z, Zk

Teoretické minimum z PJV

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

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

4. Typ ukazatel, strukturované datové typy

ADT/ADS = abstraktní datové typy / struktury

PB071 Programování v jazyce C

x86 assembler and inline assembler in GCC

Matematika v programovacích

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Základní datové struktury

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

Výrazy, operace, příkazy

7. Datové typy v Javě

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Jazyk C# a platforma.net

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

11. Přehled prog. jazyků

Algoritmizace a programování

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

ZÁKLADY PROGRAMOVÁNÍ V C

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Datové typy pro reálná čísla

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

Konstruktory a destruktory

Dědění, polymorfismus

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.

konstruktory a destruktory (o)

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

Zápis programu v jazyce C#

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

Generické programování

Pohled do nitra mikroprocesoru Josef Horálek

Paměť počítače. alg2 1

PB071 Programování v jazyce C Jaro 2014

ISU Cvičení 3. Marta Čudová

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Transkript:

Principy nízkoúrovňového programování Typový systém, Dynamická alokace Slidy pro komentáře (děkuji!): https://drive.google.com/open?id=1tnv JzyDVOb_2p9emjqyv-z-7vs80AyYQ

Pokus: komentáře ke slidům Komentář ke konkrétnímu slidu: Probráno příliš rychle Bylo jasné, zrychlit Klíčové slovo const chybně vysvětleno Odkaz xy nefunguje Bylo by super zmínit xyz OK (kalibrace na celkový počet) Komentář vložte co nejpřesněji k cílovému místu Dnešní slidy: https://drive.google.com/file/d/1tnvjzydvob_2p9 emjqyv-z-7vs80ayyq/view?usp=sharing

Varianty const int value = 0; const int value2 = 0; const int * pvalue = &value; int * const pvalue2 = &value; const int * const pvalue3 = &value; Konstantní proměnná typu int Ukazatel na proměnnou typu const int value = 10; //OK value2 = 10; //ERROR *pvalue = 10; //ERROR pvalue = &value; //OK *pvalue2 = 10; //OK pvalue2 = &value; //ERR *pvalue3 = 10; //ERR pvalue3 = &value; //ERR Konstantní ukazatel na proměnnou typu int Konstantní ukazatel na proměnnou typu const int

Typový systém

Typový systém - motivace Celé znaménkové číslo se reprezentuje nejčastěji v dvojkovém doplňkovém kódu ival1 = 5 (dvojkový doplňkový) 00000000000000000000000000000101 int ival1 = 5; Číslo 5, uložené jako reálné číslo (IEEE 754) fval1 = 5 (IEEE 754) 01000000101000000000000000000000 float fval1 = 5; Paměť ival1 interpretovaná jako reálné číslo 7.006492321624085-45 Procesor musí vědět, jak paměť interpretovat! datový typ části paměti

Typový systém obecně Co je typový systém každá hodnota je na nejnižší úrovni reprezentována jako sekvence bitů každá hodnota během výpočtu má přiřazen svůj typ typ hodnoty dává sekvenci bitů význam jak se má interpretovat Jsou definovány pravidla jak se mohou měnit typy hodnot které typy mohou být použity danou operací C je staticky typovaný systém typ kontrolován během překladu

Typový systém zajišťuje Aby nebylo nutné přemýšlet na úrovni bitů podpora abstrakce (celé číslo, ne sekvence bitů) Aby se neprováděla operace nad neočekávaným typem hodnoty jaký má význam dělení řetězců? Typ proměnných může být kontrolován překladačem při kompilaci staticky typovaný systém, konzervativnější běhovým prostředím dynamicky typovaný systém Aby bylo možné lépe optimalizovat

Typová kontrola překladačem 1. Určí se typ výrazu (dle typů literálů) 2. Pokud je použit operátor, zkontroluje se typ operandů resp. funkčních argumentů 3. Pokud daný operátor není definován pro určený typ, provede se pokus o automatickou konverzi hierarchie typů umožňujících automatickou konverzi např. int float ANO, int float* NE 4. Pokud nelze provést automatickou konverzi, ohlásí překladač chybu error: invalid conversion from 'int*' to 'int' int ivalue; int ivalue2 = &ivalue; 5. Je zajištěno, že operace se provedou jen nad hodnotami povolených typů (POZOR: neznamená validní výsledek!)

Konverze typů - přetypování Automatická (implicitní) konverze proběhne bez dodatečného příkazu programátora anglicky type coercion float realval = 10; // 10 je přetypováno z int na float Explicitní konverzi vynucuje programátor syntaxe explicitního přetypování: (nový_typ) výraz anglicky type conversion, typecasting float value = (float) 5 / 9; // 5 přetypováno z int na float pozor na: float value = (float) (5 / 9); 5 i 9 jsou defaultně typu int výraz 5/9 je tedy vyhodnocen jako celočíselné dělení 0 0 je přetypována z int na float a uložena do value

Automatická typová konverze Automatická typová konverze může nastat při: 1. Vyhodnocení výrazu int value = 9.5; 2. Předání argumentů funkci void foo(float param); foo(5); 3. Návratové hodnotě funkce double foo() { return 5; }

Zarovnání dat v paměti Proměnné daného typu můžou vyžadovat zarovnání v paměti (závislé na architektuře) char na každé adrese int např. na násobcích 4 float např. na násobcích 8 Pokus o přístup na nezarovnanou paměť dříve způsoboval pád programu nyní jádro OS obslouží za cenu výrazného zpomalení programu Paměťový aliasing na stejné místo v paměti více ukazatelů s různým typem Striktnější varianta: Strict aliasing žádné dvě proměnné různého typu neukazují na stejné místo zavedeno z důvodu možnosti optimalizace standard vyžaduje, ale lze vypnout http://en.wikipedia.org/wiki/aliasing_%28computing%29

Způsob provedení konverze Konverze může proběhnout na bitové nebo sémantické úrovni Bitová úroveň vezme bitovou reprezentaci původní hodnoty a interpretuji ji jako hodnotu v novém typu pole float jako pole char float jako int... float farray[10]; char* carray = (char*) farray; Pozn.: výše uvedený kód nesplňuje požadavek na strict aliasing a není dle standardu validní (viz dříve) Sémantická úroveň vyčte hodnotu původního typu a uloží ji do nového typu např. int a float jsou v paměti realizovány výrazně odlišně dvojkový doplňkový kód pro int vs. IEEE 754 pro float float fvalue = 5.4; int ivalue = fvalue; 5.4 je typu double konverze na float (5.4, bez ztráty) fvalue konverze na int (5, ztráta) výrazný rozdíl oproti bitové konverzi

bitová konverze sémantická konverze Ukázky konverzí float fval = 5.3; char cval = fval; float farray[10]; 4 float fval = 5.3; char* carray = (char*) farray; 0x00401352 <+14>: mov $0x40a9999a,%eax 0x00401357 <+19>: mov %eax,0x4c(%esp) 5 char cval = fval; 0x0040135b <+23>: flds 0x4c(%esp) 0x0040135f <+27>: fnstcw 0xe(%esp) 0x00401363 <+31>: mov 0xe(%esp),%ax 0x00401368 <+36>: mov $0xc,%ah 0x0040136a <+38>: mov %ax,0xc(%esp) 0x0040136f <+43>: fldcw 0xc(%esp) 0x00401373 <+47>: fistp 0xa(%esp) 0x00401377 <+51>: fldcw 0xe(%esp) 0x0040137b <+55>: mov 0xa(%esp),%ax 0x00401380 <+60>: mov %al,0x4b(%esp) 6 7 float farray[10]; 8 char* carray = (char*) farray; 0x00401384 <+64>: lea 0x1c(%esp),%eax 0x00401388 <+68>: mov %eax,0x44(%esp)

(Ne)ztrátovost typové konverze Bitová konverze není ztrátová neměníme obsah paměti, jen způsob její interpretace lze zase změnit typ zpět (platí jen dokud do paměti nezapíšeme) Sémantická typová konverze může být ztrátová uložení větší hodnoty do menšího typu (int a char) ztráta znaménka (int do unsigned int) ztráta přesnosti (double do float) reprezentace čísel (16777217 jako float)

Ukázka ztrátovosti při typové konverzi int ivalue = 16777217; float fvalue = 16777217.0; printf("the integer is: %i\n", ivalue); printf("the float is: %f\n", fvalue); printf("their equality: %i\n", ivalue == fvalue); int ivalue = 16777217; double fvalue = 16777217.0; printf("the integer is: %i\n", ivalue); printf("the double is: %f\n", fvalue); printf("their equality: %i\n", ivalue == fvalue); Příklad z http://en.wikipedia.org/wiki/type_conversion The integer is: 16777217 The float is: 16777216.000000 Their equality: 0 The integer is: 16777217 The double is: 16777217.000000 Their equality: 1

Přetypování ukazatelů float farray[10]; char* carray = (char*) farray; Ukazatele lze přetypovat bitové přetypování, mění se interpretace, nikoli hodnota Po přetypování jsou data na odkazované adrese interpretována jinak závislost na bitové reprezentaci datových typů float* farray farray[0] farray[1] 0x12345678 char* carray... 0x12345678 carray[2] carray[0] carray[1] Pozor na požadavek standardu na strict aliasing Neměly by existovat dva ukazatele různého typu na stejnou paměť s výjimkou (char*) a (void*) omezuje možnost optimalizace překladačem

Přetypování ukazatelů void* Některé funkce mohou pracovat i bez znalosti datového typu např. nastavení všech bitů na konkrétní hodnotu např. bitové operace (^, &... ) Je zbytečné definovat separátní funkci pro každý datový typ namísto specifického typu ukazatele se použije void* void* memset(void* ptr, int value, size_t num); int array[100]; memset(array, 0, sizeof(array));

Přetypování ukazatelů - využití 8bit 8bit 8bit 8bit 8bit array[i] eax Některé operace fungují na úrovni bitů např. XOR, AND... instrukce procesoru u x86 pracují na úrovni 32 bitů při práci na úrovni např. char (8 bitů) se nevyužívá celý potenciál šířky registru (32 bitů) unsigned char array[80]; // Will execute 80 iteration for (int i = 0; i < sizeof(array); i++) array[i] ^= 0x55; // Will execute only 20 iteration (x86) for (int i = 0; i < (sizeof(array) / sizeof(int)); i++) { ((unsigned int*) array) [i] ^= 0x55555555; } POZOR, bude fungovat jen pro sizeof(int) == 4 8bit array[i] Proč? Jak udělat funkční obecně?

Vhodnost použití přetypování Typová kontrola výrazně snižuje riziko chyby nedovolí nám dělat nekorektní operace klíčová vlastnost moderních jazyků! Explicitní přetypování obchází typový systém programátor musí využít korektně, jinak problém Snažte se obejít bez typové konverze automatické i explicitní Nepiště kód závisející na automatické konverzi vyžaduje po čtenáři znalost možných konverzí Preferujte explicitní konverzi před implicitní je čitelnější a jednoznačnější

Prednaska 05 Typový systém

Dynamická alokace

Dynamická alokace - motivace U statické alokace je velikost nebo počet známa v době překladu int array[100]; int a, b, c; Často ale tyto informace nejsou známy např. databáze se rozšiřuje např. textový popisek má typicky 20 znaků, ale může mít i 1000 neefektivní mít vždy alokováno 1000 znaků Dynamická alokace umožňuje vytvořit datovou položku (proměnnou, pole, strukturu) až za běhu

Dynamická alokace Statická alokace, Pole s proměnnou délkou (VLA) Organizace paměti Instrukce (program) nemění se Statická data (static) většina se nemění, jsou přímo v binárce globální proměnné (mění se) Zásobník (stack) mění se pro každou funkci lokální proměnné Halda (heap) mění se při každém malloc, free dynamicky alokované prom. Celková paměť programu Instrukce push %ebp 0x00401345 mov %esp,%ebp 0x00401347 sub $0x10,%esp 0x0040134d call 0x415780 Statická a glob. data Hello, World {0xde 0xad 0xbe 0xef} Zásobník lokalniprom1 lokalniprom2 Halda dynalokace1 dynalokace2

Statická vs. dynamická alokace Statická alokace alokuje na zásobníku (stack) automaticky se uvolňuje po dokončení bloku kódu typicky konec funkce, konec cyklu for výrazně rychlejší Na zásobníku nevzniká fragmentace, snadné uvolnění paměti Paměť u vrcholu zásobníku je typicky v cache využití pro krátkodobé proměnné/objekty int array[100]; Dynamická alokace na haldě (heap) zůstává do explicitního uvolnění (nebo konce aplikace) využití pro dlouhodobé paměťové entity int* array = malloc(variable_len*sizeof(int)); Specialitou je alokace polí s variabilní délkou (od C99) délka není známa v době překladu ale alokuje se na zásobníku a automaticky odstraňuje int array[variable_length];

Funkce pro dynamickou alokaci paměti #include <stdlib.h> void* malloc(size_t n) alokuje paměť o zadaném počtu bajtů jeden souvislý blok (jako pole) na haldě (heap) paměť není inicializována ( smetí ) pokud se nezdaří, tak vrací NULL void* calloc(size_t n, size_t sizeitem) obdobné jako malloc ale alokuje n * sizeitem + inicializuje paměť na 0

Změna velikosti alokované paměti void * realloc ( void * ptr, size_t size ); pokud je ptr == NULL, tak stejně jako malloc() pokud je ptr!= NULL, tak změní velikost alokovaného paměťového bloku na hodnotu size pokud size == 0, tak stejně jako free() Obsah původního paměťového bloku je zachován pokud je nová velikost větší než stará jinak je zkrácen Při zvětšení je dodatečná paměť neinicializovaná stejně jako při malloc()

Uvolňování alokované paměti void free(void*) uvolní na haldě alokovanou paměť musí být hodnota ukazatele vrácená předchozím malloc() nelze uvolnit jen část paměti (např. od ukazatele modifikovaného pomocí ukazatelové aritmetiky) Pozor na přístup na paměť po zavolání free(paměť) paměť již může být přidělena jiné proměnné Tzv. use-after-free zranitelnost (exploits) Pozor, free() nemaže obsah paměti citlivá data dobré předem smazat (klíče, osobní údaje) Je vhodné nastavit uvolněný ukazatel na NULL Opakované free je korektní pokud je argument NULL Přístup na adresu je sice nevalidní, ale nepřepisuje používané data

Rychlé nastavování paměti memset() void* memset(void * ptr, int value, size_t num); Nastaví paměť na zadanou hodnotu Výrazně rychlejší než cyklus for pro inicializaci Pracuje na úrovni bajtů časté využití v kombinaci se sizeof() void* memset(void* ptr, int value, size_t num); int array[100]; memset(array, 0, sizeof(array));

Dynamická alokace - shrnutí 1. Alokuje potřebný počet bajtů (musíme správně vypočíst) typicky používáme počet_prvků*sizeof(prvek) 2. Uložíme adresu paměti do ukazatele s požadovaným typem int* array = malloc(100 * sizeof(int)); 3. Po konci práce uvolníme free(array);

Ilustrace statické vs. dynamické alokace void foo() { char array1[10]; char* array2 = malloc(10); array1[2] = 1; array2[2] = 1; } int main() { foo(); array1 01010111110010101 array2 0x12345678 Neuvolněná paměť, memory leaks malloc() 0101001100100101 foo(); array1 0101010100100101 array2 malloc() 0x87654321 10101011001010110101 } return 0; Zásobník Halda Paměťové bloky na haldě zůstávají do zavolání free()

Memory leaks Dynamicky alokovaná paměť musí být uvolněna dealokace musí být explicitně provedena vývojářem (C nemá Garbage collector) Valgrind nástroj pro detekci memory leaks (mimo jiné) valgrind -v --leak-check=full testovaný_program lze využít např. Eclipse Valgrind plugin Na Windows 10 lze využít Linux subsystém http://www.albertgao.xyz/2016/09/28/how-to-use-valgrind-on-windows/ Microsoft Visual Studio automaticky zobrazuje detekované memory leaks v debug režimu Detekované memory leaks ihned odstraňujte stejně jako v případě warningu nevšimnete si jinak nově vzniklých obtížně dohledáte místo alokace

násobná alokace dealokace s modifikovaným ukazatelem Memory leaks demo Násobná alokace do stejného ukazatele Dealokace nad modifikovaným ukazatelem #include <stdlib.h> int main(int argc, char* argv[]) { int* parray = NULL; const int arraylen = 25; parray = malloc(arraylen * sizeof(int)); if ((argc == 2) && atoi(argv[1]) == 1) { parray = malloc(arraylen * sizeof(int)); } if (parray) { free(parray); parray = NULL; } int* parray2 = 0; parray2 = malloc(arraylen * sizeof(int)); parray2 += 20; // chyba if (parray2) { free(parray2); parray2 = NULL; } } return 0;

int main() { int myvalue1 = 1; int myvalue2 = 1; } Předávání hodnotou a hodnotou ukazatele valuepassingdemo(myvalue1, &myvalue2); return 0; void valuepassingdemo(int value, int* pvalue) { value = 5; *pvalue = 7; } Zásobník myvalue1 1 myvalue2 17 value 15 pvalue &myvalue2 Proměnná value i pvalue zaniká, ale zápis do myvalue2 zůstává

Předávání alokovaného pole z funkce Neuvolněná paměť Jak předat pole dyn. alokované ve funkci? ukazatel na ukazatel int main() { int* pmypointer = NULL; allocatearraydemo(pmypointer, &pmypointer); free(pmypointer); } return 0; Zásobník pmypointer 0x4733487 NULL Halda 01010100011 void allocatearraydemo(int* parray, int** pparray) { // address will be lost, memory leak parray = malloc(10 * sizeof(int)); // warning: integer from pointer BAD *parray = malloc(10 * sizeof(int)); // OK *pparray = malloc(10 * sizeof(int)); } parray 0x3287643 NULL pparray &pmypointer 01010100011

Dynamická alokace vícedimenz. polí 2D pole je pole ukazatelů na 1D pole 3D pole je pole ukazatelů na pole ukazatelů na 1D pole void allocate2darray() { // 100 items array with elements int* const int LEN = 100; int** array2d = malloc(len * sizeof(int*)); for (int i = 0; i < LEN; i++) { // allocated 1D array on position array2d[i] // length is i+1 * 10 array2d[i] = malloc((i+1) * 10 * sizeof(int)); } array2d[10][20] = 1; } // You need to free memory properly for (int i = 0; i < LEN; i++) { free(array2d[i]); array2d[i] = NULL; } free(array2d); array2d = NULL;

Dynamická alokace zřetězený seznam Struktura s neomezenou velikostí položky na haldě logicky propojené ukazateli 13,7,13,-45,154 Položky nejsou v poli za sebou 0x... -45 0x... 13 0x... 13 0x... 7 0x... 154 NULL 0

Dynamická alokace - poznámky Při dealokaci nastavte proměnnou zpět na NULL opakovaná dealokace nezpůsobí pád validitu ukazatele nelze testovat, ale hodnotu NULL ano Dynamická alokace je důležitý koncept je nutné znát a rozumět práci s ukazateli Dynamicky alokovanou paměť přiřazujeme do ukazatele sizeof(pointer) vrací velikost ukazatele, nikoli velikost pole! Dynamická (de-)alokace nechává paměť v původním stavu neinicializovaná paměť & zapomenuté klíče

Alokace paměti - typy 1. Paměť alokovaná v době překladu s pevnou délkou ve statické sekci typicky konstanty, řetězce, konstantní pole const char* hello = "Hello World"; délka známa v době překladu alokováno ve statické sekci programu (lze nalézt v nespuštěném programu) 2. Paměť alokovaná za běhu na zásobníku, délka známa v době překladu lokální proměnné, lokální pole paměť je alokována a dealokována automaticky int array[10]; 3. Paměť alokovaná za běhu na zásobníku, délka není známa v době překladu variable length array, od C99 paměť je alokována a dealokována automaticky int array[usergivenlength]; 4. Paměť alokovaná za běhu na haldě, délka není známa v době překladu alokace i dealokace explicitně prostřednictvím funkcí malloc a free programátor musí hlídat uvolnění, jinak memory leak int* array=malloc(usergivenlength*sizeof(int)); free(array);

Prednaska 05 Dynamická alokace

Shrnutí Explicitní vs. Implicitní typové konverze Dynamická alokace je velmi důležitý praktický koncept Většina paměti je typicky dynamicky alokovaná V C je programátor odpovědný za uvolnění paměti Dynamicky alokované struktury jsou typicky náročnější na ladění Defensivní programování, výpisy, debugger

Bonus

Arduino.cc Open-source hardware projekt http://arduino.cc/en/main/hardware + free vývojové prostředí + velké množství existujících projektů cena cca 200Kč Alternativní klony http://jeelabs.com/products/jeenode včetně rádiové komunikace Programování v C vše připraveno, velice snadné (vyzkoušejte!) Projekty na ovládání LED, sensory, roboti, Ethernet, Bluetooth...

Arduino Uno - Fade

Elektroměr

Měření rychlosti projetí okruhu Autíčko indukuje náboj na připojeném drátu Pomocí arduina lze náboj změřit a detekovat průjezd cílem

Brain machine Brain machine project (M. Altman) http://makezine.com/im ages/store/make_v10 _BrainMachine_Project _F2.pdf Založeno na Arduinu http://low.li/story/2011/0 1/arduino-brainmachine

Inspirace? Zaujalo mě Arduino, které jste nám ukazoval v Céčku, tak jsem si říkal, že ho zkusím použít. Napadlo mně postavit si