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

Podobné dokumenty
9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

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

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

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

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

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

ADT/ADS = abstraktní datové typy / struktury

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

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Algoritmizace a programování

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

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

Základy programování (IZP)

Algoritmizace a programování

8 Třídy, objekty, metody, předávání argumentů metod

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

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

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

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

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

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

POČÍTAČE A PROGRAMOVÁNÍ

Algoritmizace a programování

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

Ukazatele, dynamická alokace

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

Struktura programu v době běhu

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

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

Základy programování (IZP)

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

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

Základy programování (IZP)

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

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

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Algoritmizace a programování

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ý

Více o konstruktorech a destruktorech

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

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

Úvod do programování. Lekce 1

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

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Datové typy a struktury

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

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

Základy programování (IZP)

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

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

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

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

Algoritmizace prostorových úloh

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

2 Datové typy v jazyce C

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

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

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

Sada 1 - Základy programování

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Úvod do programovacích jazyků (Java)

MAXScript výukový kurz

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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í

Systém adresace paměti

Mělká a hluboká kopie

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

Algoritmizace prostorových úloh

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Přednáška. Správa paměti I. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

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

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Výčtový typ strana 67

C2110 Operační systém UNIX a základy programování

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Základní datové struktury

Úvod do programovacích jazyků (Java)

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

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

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

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Anotace. Pointery. Martin Pergel,

Ukazatele #2, dynamická alokace paměti

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Algoritmizace a programování

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

Datové typy strana 29

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

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

Matematika v programovacích

Transkript:

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

https://en.cppreference.com internetová stránka s referencemi https://gedit.en.softonic.com/download download editoru zdrojového kódu Gedit http://tdm-gcc.tdragon.net/download - dawnload kompilátoru gcc 2/73

Zrození jazyka C Céčko navrhl Dennis Ritchie, tvůrce operačního systému UNIX, Bellovy laboratoře, Murray Hill, New Jersey (USA), rok 1972 3/73

Výhody jazyka C: 4/73

Výhody jazyka C: extrémně rychlý 5/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) 6/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: 7/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: nízký komfort pro programátora 8/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: nízký komfort pro programátora neumí pracovat s textovými řetězci 9/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: nízký komfort pro programátora neumí pracovat s textovými řetězci nemá grafické rozhraní 10/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: nízký komfort pro programátora neumí pracovat s textovými řetězci nemá grafické rozhraní nepodporuje objektově orientované programování 11/73

Výhody jazyka C: extrémně rychlý multiplatformní (pracuje na většině operačních systémů) Nevýhody jazyka C: nízký komfort pro programátora neumí pracovat s textovými řetězci nemá grafické rozhraní nepodporuje objektově orientované programování Speciální vlastnost: přímý přístup do paměti (rychlejší přístup, ale nutno pečlivě pracovat s deklarací proměnných) 12/73

Procesy od programování do spuštění programu: 13/73

Procesy od programování do spuštění programu: 1) vytvoření zdrojového kódu v programovacím jazyce C 14/73

Procesy od programování do spuštění programu: 1) vytvoření zdrojového kódu v programovacím jazyce C 2) z kompilování do strojového kódu (pouze v případě bezchybného kódu) 15/73

Procesy od programování do spuštění programu: 1) vytvoření zdrojového kódu v programovacím jazyce C 2) z kompilování do strojového kódu (pouze v případě bezchybného kódu) 3) Spuštění strojového kódu v procesoru (na operačním systému) 16/73

Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... 17/73

Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: #include <knihovna> 18/73

Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: #include <knihovna> knihovny: stdio.h - vstupy a výstupy 19/73

#include <knihovna> Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: knihovny: stdio.h - vstupy a výstupy stdlib.h - standardní knihovna se základními instrukcemi 20/73

#include <knihovna> Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: knihovny: stdio.h - vstupy a výstupy stdlib.h - standardní knihovna se základními instrukcemi math.h - matematické funkce 21/73

Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: #include <knihovna> knihovny: stdio.h - vstupy a výstupy stdlib.h - standardní knihovna se základními instrukcemi math.h - matematické funkce assert.h - funkce pro kontrolu programu 22/73

#include <knihovna> Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: knihovny: stdio.h - vstupy a výstupy stdlib.h - standardní knihovna se základními instrukcemi math.h - matematické funkce assert.h - funkce pro kontrolu programu string.h - funkce pro práci s polem znaků (char) jako se stringem 23/73

#include <knihovna> Připojení systémových knihoven Systémové knihovny umožňují využívat různé funkce jazyka C... Zápis do kódu programu: knihovny: stdio.h - vstupy a výstupy stdlib.h - standardní knihovna se základními instrukcemi math.h - matematické funkce assert.h - funkce pro kontrolu programu string.h - funkce pro práci s polem znaků (char) jako se stringem Do kódu programu knihovny zapisujeme na začátek - před hlavní program. 24/73

Základní datové typy 25/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! 26/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! Pozor: Při definici proměnné je důležité, jestli použijeme malá nebo velká písmena v názvech proměnných nebo funkcí! Proměnná a není proměnná A! 27/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! Pozor: Při definici proměnné je důležité, jestli použijeme malá nebo velká písmena v názvech proměnných nebo funkcí! Proměnná a není proměnná A! int integer (celé číslo 2^32 a6 +2^32 1) int A; nebo int A = hodnota; Pokud není uvedeno rovnítko a hodnota, pak proměnná má nedefinovanou hodnotu, tedy nějakou hodnotu, kterou náhodně obsahuje paměť, kterou operační systém přidělil programu a program přidělil proměnné. To může způsobit problémy při chodu programu a je tedy nutné dát pozor na přidělení hodnot proměnným dříve, než je budeme zpracovávat v programu! 28/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! Pozor: Při definici proměnné je důležité, jestli použijeme malá nebo velká písmena v názvech proměnných nebo funkcí! Proměnná a není proměnná A! int integer (celé číslo 2^32 a6 +2^32 1) int A; nebo int A = hodnota; Pokud není uvedeno rovnítko a hodnota, pak proměnná má nedefinovanou hodnotu, tedy nějakou hodnotu, kterou náhodně obsahuje paměť, kterou operační systém přidělil programu a program přidělil proměnné. To může způsobit problémy při chodu programu a je tedy nutné dát pozor na přidělení hodnot proměnným dříve, než je budeme zpracovávat v programu! char jeden znak (reprezentován číslem od -128 do +127) 29/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! Pozor: Při definici proměnné je důležité, jestli použijeme malá nebo velká písmena v názvech proměnných nebo funkcí! Proměnná a není proměnná A! int integer (celé číslo 2^32 a6 +2^32 1) int A; nebo int A = hodnota; Pokud není uvedeno rovnítko a hodnota, pak proměnná má nedefinovanou hodnotu, tedy nějakou hodnotu, kterou náhodně obsahuje paměť, kterou operační systém přidělil programu a program přidělil proměnné. To může způsobit problémy při chodu programu a je tedy nutné dát pozor na přidělení hodnot proměnným dříve, než je budeme zpracovávat v programu! char jeden znak (reprezentován číslem od -128 do +127) double desetinné číslo (pozor: desetinná tečka!) 30/73

Základní datové typy Každá proměnná musí být deklarovaná v proceduře dříve, než je napsán první příkaz! Pozor: Při definici proměnné je důležité, jestli použijeme malá nebo velká písmena v názvech proměnných nebo funkcí! Proměnná a není proměnná A! int integer (celé číslo 2^32 a6 +2^32 1) int A; nebo int A = hodnota; Pokud není uvedeno rovnítko a hodnota, pak proměnná má nedefinovanou hodnotu, tedy nějakou hodnotu, kterou náhodně obsahuje paměť, kterou operační systém přidělil programu a program přidělil proměnné. To může způsobit problémy při chodu programu a je tedy nutné dát pozor na přidělení hodnot proměnným dříve, než je budeme zpracovávat v programu! char jeden znak (reprezentován číslem od -128 do +127) double desetinné číslo (pozor: desetinná tečka!) float desetinné číslo s menším rozsahem (pozor: desetinná tečka!) 31/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! 32/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string neexistuje, použije se pole char 33/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string pole neexistuje, použije se pole char definice: datový_typ jméno_proměnné[počet prvků] např. int pole[10]; pole deseti prvků, první index je nula, poslední devět! 34/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string pole neexistuje, použije se pole char definice: datový_typ jméno_proměnné[počet prvků] např. int pole[10]; pole deseti prvků, první index je nula, poslední devět! pointer definice: datový_typ *jmeno_proměnné 35/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string pole neexistuje, použije se pole char definice: datový_typ jméno_proměnné[počet prvků] např. int pole[10]; pole deseti prvků, první index je nula, poslední devět! pointer definice: datový_typ *jmeno_proměnné Např.: int *promenna1; proměnná, které obsahuje adresu v paměti RAM, kde je uložena hodnota typu integer. Pokud chceme přistoupit k hodnotě, která je uložena pod daným pointerem, pak před jménem proměnné zapíšeme hvězdičku! Hodnota proměnné promenna1 je adresa do paměti RAM, na které je v paměti uložena hodnota (např. nějaké číslo). 36/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string pole neexistuje, použije se pole char definice: datový_typ jméno_proměnné[počet prvků] např. int pole[10]; pole deseti prvků, první index je nula, poslední devět! pointer definice: datový_typ *jmeno_proměnné Např.: int *promenna1; proměnná, které obsahuje adresu v paměti RAM, kde je uložena hodnota typu integer. Pokud chceme přistoupit k hodnotě, která je uložena pod daným pointerem, pak před jménem proměnné zapíšeme hvězdičku! Hodnota proměnné promenna1 je adresa do paměti RAM, na které je v paměti uložena hodnota (např. nějaké číslo). Příklad adresy paměťové buňky (1 Byte) v paměti RAM: 0060FF0C 37/73

boolean používá se proměnná typu integer; 0 je false, jiné číslo je true!!! string pole neexistuje, použije se pole char definice: datový_typ jméno_proměnné[počet prvků] např. int pole[10]; pole deseti prvků, první index je nula, poslední devět! pointer definice: datový_typ *jmeno_proměnné Např.: int *promenna1; proměnná, které obsahuje adresu v paměti RAM, kde je uložena hodnota typu integer. Pokud chceme přistoupit k hodnotě, která je uložena pod daným pointerem, pak před jménem proměnné zapíšeme hvězdičku! Hodnota proměnné promenna1 je adresa do paměti RAM, na které je v paměti uložena hodnota (např. nějaké číslo). Do proměnné typu pointer se ukládá adresa v paměti, kde je uložena nějaká hodnota! 38/73

*promenna1 = 10; Znamená, že jsme na adresu uloženou v proměnné promenna1 zapsali hodnotu 10 (změníme hodnotu modré buňky). 39/73

*promenna1 = 10; Znamená, že jsme na adresu uloženou v proměnné promenna1 zapsali hodnotu 10 (změníme hodnotu modré buňky). Pokud chceme získat adresu proměnné a uložit ji do pointeru, pak před jméno proměnné zapíšeme & (bez mezery): promenna1 = &A; (změníme hodnotu červené buňky). 40/73

Použití pointeru void mojefunkce (int x) v hlavním programu: int data = 123; mojefunkce (data); Z hlavního programu voláme funkci mojefunkce s parametrem data. To je proměnná typu integer, která obsahuje hodnotu 123. Tato hodnota se vloží v funkci moje funkce do proměnné x. Od této chvíle jsou proměnné data a x zcela odděleny a nijak na sobě nezávisí. V dalším zpracování může každá z těchto proměnných obsahovat jinou hodnotu. 41/73

Pokud chceme, aby se změna hodnoty, která se stane ve funkci moje funkce, přenesla do hlavního programu zpět do proměnné data, potom musí být ve funkci mojefunkce x datového typu jako odkaz na hodnotu typu integer: void mojefunkce (int *x) { *x=321; } v hlavním programu: int data = 123; mojefunkce (&data); Při volání funkce mojefunkce použijeme jako parametr adresu proměnné data a vložíme ji do proměnné x (ve funkci moje funkce). Tuto adresu získáme tak, že před proměnnou, kterou použijeme jako parametr volání funkce mojefunkce, vložíme znak &. 42/73

NULL je speciální hodnota ukazatele. Znamená, že ukazatel neukazuje nikam! Např.: int *x=null; *x=10; Chyba nelze vložit hodnotu na neexistující adresu! (nevíme, kam vložit...) Příklad použití pointeru: int a, *p_a; a = 56; printf("promenna a s hodnotou %d je v pameti ulozena na adrese %p", a, &a); p_a = &a; // Uloží do p_a adresu proměnné a *p_a = 15; // Uloží hodnotu 15 na adresu v p_a printf("promenna a ma hodnotu %d", a); 43/73

Předání pole funkci: máme dvě možnosti: void mojefunkce (int *pole) nebo void mojefunkce (int pole []) V obou případech bude přenesena do funkce adresa prvního (nultého) prvku pole. 44/73

Povolené operace ukazatelů: int* + int = int* int* - int = int* int* - int* = int int* relační operátor (<,>,!=,==) int* = int Posun v paměti (změna adresy paměti), když je přičtena hodnota n, adresa se zvětší o n*sizeof (int). Posun v paměti (změna adresy paměti) Vzdálenost ukazatelů (adres v paměti) Porovná ukazatele (adresy paměti) 45/73

Pointer (ukazatel) použijeme: 46/73

Pointer (ukazatel) použijeme: když potřebujeme mít výstupní parametry ve funkci parametry, které odchází z hlavního programu do funkce a funkce je může změnit (hodnoty proměnných) a vrátit do hlavního programu 47/73

Pointer (ukazatel) použijeme: když potřebujeme mít výstupní parametry ve funkci parametry, které odchází z hlavního programu do funkce a funkce je může změnit (hodnoty proměnných) a vrátit do hlavního programu při dynamické alokaci paměti (viz dále) 48/73

Pointer (ukazatel) použijeme: když potřebujeme mít výstupní parametry ve funkci parametry, které odchází z hlavního programu do funkce a funkce je může změnit (hodnoty proměnných) a vrátit do hlavního programu při dynamické alokaci paměti (viz dále) při složitějších datových strukturách (spojové seznamy, stromy) 49/73

Binární vyhledávací strom: Umožňuje rychlejší vyhledávání než pole. Nemusíme prohledat n prvků, ale pouze dvojkový logaritmus n : log 2 (n). 50/73

Jednosměrně zřetězený spojový seznam V prvku seznamu jsou data a odkaz na další prvek. Využívá se ve v datových typech fronta (údaj, který první přijde, první odejde) a zásobník (údaj, který první přijde, poslední odejde). 51/73

Obousměrně zřetězený spojový seznam Každý prvek obsahuje odkaz na prvek následující a také předchozí. Cyklicky zřetězený spojový seznam sentinel je vstupní prvek Každý prvek obsahuje odkaz na prvek následující, poslední prvek obsahuje odkaz na první. 52/73

Definice statické proměnné: Je uložena na zásobníku (část paměti, která je přidělena programu omezené místo řádově v MB), v proměnné je uložena přímo hodnota daného typu. int A = hodnota; nebo int A; int A[10]; int A[] = {1,2,3,4,5,4,3,2,1,0}; elementární statická proměnná pole o deseti nedefinovaných prvcích automaticky se přiřadí počet prvků U statického pole nelze měnit jeho velikost! 53/73

Definice dynamické proměnné: Funkce pro dynamickou alokaci proměnné jsou v knihovně stdlib. Je uložena na haldě (část paměti, která je přidělena programu, zbytek nevyužité paměti), v proměnné je uložen osmibytový (64 bit OS) nebo čtyřbytový (32 bit OS) pointer, tedy ukazatel na místo v paměti, na kterém je uložena hodnota. Výhodou je vyšší rychlost, oproti statickým proměnným, přiřazování hodnot k proměnným. 54/73

Definice dynamické proměnné: Funkce pro dynamickou alokaci proměnné jsou v knihovně stdlib. Je uložena na haldě (část paměti, která je přidělena programu, zbytek nevyužité paměti), v proměnné je uložen osmibytový (64 bit OS) nebo čtyřbytový (32 bit OS) pointer, tedy ukazatel na místo v paměti, na kterém je uložena hodnota. Výhodou je vyšší rychlost, oproti statickým proměnným, přiřazování hodnot k proměnným. int *A = (int*)malloc(sizeof(int)); elementární dynamická proměnná s vyhrazením místa pro číslo typu integer bez přiřazení hodnoty 55/73

Definice dynamické proměnné: Funkce pro dynamickou alokaci proměnné jsou v knihovně stdlib. Je uložena na haldě (část paměti, která je přidělena programu, zbytek nevyužité paměti), v proměnné je uložen osmibytový (64 bit OS) nebo čtyřbytový (32 bit OS) pointer, tedy ukazatel na místo v paměti, na kterém je uložena hodnota. Výhodou je vyšší rychlost, oproti statickým proměnným, přiřazování hodnot k proměnným. int *A = (int*)malloc(sizeof(int)); elementární dynamická proměnná s vyhrazením místa pro číslo typu integer bez přiřazení hodnoty int *A=(int*)malloc(10*sizeof(int)); dynamické pole o deseti prvcích, první index 0, poslední 9 56/73

Definice dynamické proměnné: Funkce pro dynamickou alokaci proměnné jsou v knihovně stdlib. Je uložena na haldě (část paměti, která je přidělena programu, zbytek nevyužité paměti), v proměnné je uložen osmibytový (64 bit OS) nebo čtyřbytový (32 bit OS) pointer, tedy ukazatel na místo v paměti, na kterém je uložena hodnota. Výhodou je vyšší rychlost, oproti statickým proměnným, přiřazování hodnot k proměnným. int *A = (int*)malloc(sizeof(int)); elementární dynamická proměnná s vyhrazením místa pro číslo typu integer bez přiřazení hodnoty int *A=(int*)malloc(10*sizeof(int)); dynamické pole o deseti prvcích, první index 0, poslední 9 int *A=(int*)calloc(10*sizeof(int)); dynamické pole o deseti prvcích, první index 0, poslední 9, všechny prvky jsou vynulovány mají hodnotu nula. malloc memory allocation malloc vrací hodnotu bez určení typu (void*), proto přetypujeme (int*)malloc 57/73

Změna velikosti pole: A = realloc(a, 100*sizeof(int)) - z deseti prvků jsme změnili na 100 prvků, realloc reallocation 58/73

Změna velikosti pole: A = realloc(a, 100*sizeof(int)) - z deseti prvků jsme změnili na 100 prvků, realloc reallocation Není vhodné zvětšovat o malý počet prvků, protože zvětšení probíhá tak, že se nejprve naalokuje nová paměť, pak se prvek po prvku zkopíruje a nakonec se původní pole odstraní. 59/73

Změna velikosti pole: A = realloc(a, 100*sizeof(int)) - z deseti prvků jsme změnili na 100 prvků, realloc reallocation Není vhodné zvětšovat o malý počet prvků, protože zvětšení probíhá tak, že se nejprve naalokuje nová paměť, pak se prvek po prvku zkopíruje a nakonec se původní pole odstraní. Dynamicky alokovanou proměnnou musíme, ve chvíli, kdy ji nepotřebujeme, vždy odstranit z paměti! Trvale by zabírala místo v paměti až do ukončení chodu programu, po ukončení chodu programu všechny proměnné použité v programu odstraní operační systém. 60/73

Uvolnění dynamické proměnné (typu pointer) z paměti (RAM) free(a); - uvolní prostor v operační paměti vyhrazený proměnné A, pozor: hodnota v paměti zůstává, pokud operační systém daný prostor nevyužije, je hodnota stále přístupná! 61/73

Uvolnění dynamické proměnné (typu pointer) z paměti (RAM) free(a); uvolní prostor v operační paměti vyhrazený proměnné A, pozor: hodnota v paměti zůstává, pokud operační systém daný prostor nevyužije, je hodnota stále přístupná! free(a); A = NULL; uvolní prostor v operační paměti vyhrazený proměnné A a do proměnné A vloží NULL, to znamená, že program ztratí adresu dat uložených v paměti, od té chvíle již nemáme přístup k datům 62/73

Staticky definované dvourozměrné pole int Pole [3][4]; [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] 63/73

Dynamicky definované pole int **Pole,i; //deklarace ukazatele na ukazatel na integer Pole=(int**)malloc(3*sizeof(int*)); for(i=0;i<3;i++) Pole[i]=(int*)malloc(4*sizeof(int)); Dynamicky lze definovat pouze jednorozměrné pole. V případě potřeby definice vícerozměrného pole, např. dvourozměrného, alokujeme nejprve jednorozměrné pole ukazatelů, a potom pro každý ukazatel alokujeme pole integerů. Nejprve tak alokujeme adresy řádků a potom jednotlivé řádky. 64/73

Editace kódu programu Komentář v kódu programu // text - pro jeden řádek /* - na začátku prvního řádku komentáře */ - na konci posledního řádku komentáře Za každým řádkem, pokud kód nepokračuje složenými závorkami, musí být středník! 65/73

Hlavní program: int main (void) { kód programu return 0; } int return (void) funkce je typu integer (v hlavním programu musí být int) v případě úspěšného běhu programu vrací nulu, jinak číslo chyby bez parametrů (pokud žádné nepoužijeme) nebo 66/73

int main (int argc, char ** args) { kód programu return 0; } argc je počet parametrů (arguments count), args je pole parametrů, **args znamená odkaz na odkaz na char to znamená, že pod odkazem je dvourozměrné pole 67/73

datový_typ jmeno_procedury (parametry) a dále jako u hlavního programu Procedura: 68/73

Připojení souboru s kódem (program je napsán ve více souborech): Program může být napsán ve více souborech, to se používá, když potřebujeme program rozdělit do menších celků, např. z důvodu potřeby rozdělení na logické celky. #include cesta k souboru Pokud je druhý soubor ve stejné složce, jako soubor první (hlavní): např.: #include program2.c (Windows) #include./program2.c (Linux) 69/73

Editační prostření Kód programu lze editovat v jakémkoli textovém editoru. Postačí poznámkový blok. Na FIT ČVUT je používaný editor Gedit. Soubory s kódem programu se ukládají s koncovkou.c jmeno_souboru.c 70/73

Kompilace programu Nejprve je třeba nainstalovat kompilátor gcc. Vytvořený zdrojový kód (soubor) musíme před spuštěním zkompilovat! Kompilace: otevřeme příkazový řádek ve složce, kde máme zdrojový soubor spustíme příkaz: gcc jménosouboru vygenerovaný soubor se vždy jmenuje a.exe (windows) nebo a.out (linux) Příkaz lze také spustit s parametry, např.: gcc -Wall -pedantic jménosouboru Tento způsob kompilace vypíše, kromě chyb, také varování (neinicializovaná proměnná, podmínka, která je vždy true, přiřazení proměnné jiného datového typu do proměnné s jiným datovým typem.). 71/73

Spuštění programu Soubor s programem se spouští v příkazovém řádku otevřeného v příslušné složce příkazem: jménosouboru.exe (windows)./jmenosouboru.out (linux) 72/73

Otevření příkazového řádku: Windows 10 Start cmd Linux Start Administration - Terminal Práce s příkazovým řádkem: Windows: cd jméno_složky - vnoření do složky cd.. - výstup do nadřazené složky dir - výpis obsahu složky Linux: cd jméno_složky - vnoření do složky cd.. - výstup do nadřazené složky ls - výpis obsahu složky Poznámka: Pokud je jméno složky nebo souboru složeno z více slov oddělených mezerou, pak se název souboru nebo složky zapisuje v uvozovkách! Např.: cd Nová složka 73/73