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

Podobné dokumenty
Základy programování 2 KMI/ZP2

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

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

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

Práce s polem a pamětí

ZÁKLADY PROGRAMOVÁNÍ V C

Lineární spojový seznam (úvod do dynamických datových struktur)

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

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

Základy programování (IZP)

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

PB071 Programování v jazyce C Jaro 2015

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ý

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

ZÁKLADY PROGRAMOVÁNÍ V C

Algoritmizace a programování

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

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

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

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

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

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

Základy programování (IZP)

Funkce, intuitivní chápání složitosti

Ukazatele, dynamická alokace

PB071 Programování v jazyce C Jaro 2017

Základy programování (IZP)

Více o konstruktorech a destruktorech

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Práce se soubory. Úvod do programování 2 Tomáš Kühr

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

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

Programování v jazyce C pro chemiky (C2160) 11. Vizualizace sekvence proteinů

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

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

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

PB071 Programování v jazyce C Jaro 2013

Ukazatele #2, dynamická alokace paměti

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

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

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

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

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

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

Práce se soubory. Úvod do programování 2 Tomáš Kühr

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

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

Struktura programu v době běhu

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.

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

Programování v jazyce C a C++

Práce se soubory. Základy programování 2 Tomáš Kühr

PB071 Programování v jazyce C

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

4. Typ ukazatel, strukturované datové typy

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

Funkce, procedury, složitost

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

Programovanie v jazyku C - to chce dynamiku

Základní datové struktury

Dynamická alokace paměti

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Pokročilé architektury počítačů

Struktury a dynamická paměť

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

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

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

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

Konstruktory a destruktory

Algoritmizace a programování

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

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

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

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

Ú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 4

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Základy programování (IZP)

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

Jazyk C# a platforma.net

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

MĚŘENÍ Laboratorní cvičení z měření Měření nízkofrekvenčního koncového zesilovače, část

Základy programování (IZP)

Programování v jazyce C a C++

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

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

1. Téma 12 - Textové soubory a výjimky

Mělká a hluboká kopie

Úvod do programování - Java. Cvičení č.4

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

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

Algoritmizace a programování

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

Distanční opora předmětu: Programování v jazyce C Tématický blok č. 6: Dynamická alokace paměti, typové konstrukce Autor: RNDr. Jan Lánský, Ph.D.

Opakování programování

Lineární datové struktury

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

Transkript:

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

Motivace Zatím jsme se setkali s následjícími problémy : Proměnná existje / je dostpná jen v blok, kde vznikla Pole existje v blok, kde bylo vytvořeno int *fnkce(int a, int b) { int c = a + b; int pole[] = { a, b ; retrn &c; // NEJDE!!! retrn &a; // NEJDE!!! retrn pole; // NEJDE!!! Pole msí být vytvořeno o velikosti zadané v době kompilace int *vytvor_pole(int velikost){ int pole[velikost]; // NEJDE!!! retrn pole; // NEJDE!!! 2

Obecný kazatel Ukazatel bez vedení typ, se kterým bde moci pracovat void *pamet; Nelze s ním provádět aritmetické operace ani dereferenci int pole[3]; pamet = pole; pamet++; // NEJDE!!! int cislo = 5; void *kazatel = &cislo; *kazatel = 7; // NEJDE!!! Po přetypování je již možné provádět vše ((int *)pamet)++; *((int*)kazatel) = 7; 3

Dynamické alokování paměti Provádíme například pomocí fnkce malloc Jediný parametr dává velikost paměti, ktero chceme alokovat (v bytech) Výsledek volání fnkce je kazatel na začátek přidělené paměti (void *) Nebo NULL v případě neúspěch alokace int *pole; pole = malloc(40); // alokace 40 byt pole = malloc(10 * sizeof(int)); // spravne pole = (int *)malloc(10 * sizeof(int)); // jeste lepsi pole[0] = 10; pole[9] = 42; 4

Příklad požití Fnkce vracející pole drhých mocnin čísel ze vstpního pole: int *powers(int *inpt, int cont) { int i; int *otpt = (int *)malloc(sizeof(int) * cont); // int otpt[cont]; -> toto nefngje for (i = 0; i < cont; i++) { otpt[i] = inpt[i] * inpt[i]; retrn otpt; 5

Další možnosti alokace Fnkce void *calloc(size_t items, size_t size) alokje paměť pro items prvků o velikosti size tedy items*size bytů navíc tto paměť vyplní nlami Fnkce void *realloc(void *old, size_t size) zajišťje změn velikosti dříve alokovaného blok paměti old na velikost size data původního blok paměti bdo zkopírována Všechny zmíněné fnkce najdete v knihovně stdlib.h 6

Uvolnění paměti Pokd alokovano paměť (pomocí malloc, calloc, realloc) nepotřebjeme, měli bychom ji volnit Jinak bde nedostpná až do konce program Toto může způsobit reálného softwar značné problémy K volnění paměti se požívá fnkce void free(void *block) Příklad: int *cisla = (int *)calloc(velikost, sizeof(int)); // tady pole cisla k necem požijeme // a kdyz z neni potreba free(cisla); 7

Příklad práce s pamětí const int b_length = 100; /* block length */ int *data, *h; int b_cont = 1; /* block cont */ data = (int *)malloc(b_length * sizeof(int)); if (data == NULL) retrn 1; /* chyba */ b_cont++; h = (int *) realloc(data, b_cont * b_length * sizeof(int)); if (h == NULL) retrn 1; /* chyba */ else data = h; free(data); 8

Parametry a návratová hodnota Běžně fnkce vrací jeden výsledek pomocí své návratové hodnoty int socet(int a, int b) { retrn a + b; Změny parametrů v těle fnkce se neprojeví v místě volání fnkce int nsd(int a, int b){ while (b){ int r = a % b; a = b; b = r; retrn a; int prvni = 84, drhe = 120; printf("%i", nsd(prvni, drhe)); 9

Pole jako parametr fnkce Troch jinak se chová jako parametr fnkce pole void na2(int cisla[], int pocet){ for (int i = 0; i < pocet; i++) cisla[i] *= cisla[i]; int data[] = { 1, 2, 3, 4, 5 ; na2(data, 5); for (int i = 0; i < 5; i++) printf("%i, ", data[i]); Proč? 10

Parametr předávaný odkazem Stejného princip můžeme požít i jiných typů parametrů void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; int prvni = 84, drhe = 120; swap(&prvni, &drhe); Lze vyžít pro fnkce, které mění parametry Nebo mají více návratových hodnot Další výhodo může být nevytváření kopie dat (tj. šetření paměti; především velkých strktr) 11

Předání pole odkazem Pokd bychom chtěli změnit vnitř fnkce samotný kazatel: int vytvor_pole(int pocet, int hodnota, int **vysledek){ *vysledek = (int *)malloc(počet * sizeof(int)); if (*vysledek) for (int i = 0; i < pocet; i++) (*vysledek)[i] = hodnota; else { printf("chyba!"); retrn 1; retrn 0; int *jednicky; vytvor_pole(10, 1, &jednicky); for (int i = 0; i < 10; i++) printf("%i, ", jednicky[i]); 12

Předávání hodnoto vs. odkazem Při předávání hodnoto: Parametr je jen vstpní Typ parametr odpovídá datům Při volání předáváme jakokoli hodnot daného typ Běžný způsob předání parametr void moje_fce(int data){ int cislo; moje_fce(cislo); moje_fce(3 * cislo); Při předávání odkazem: Parametr může být i výstpem Typ parametr je kazatel na typ dat Při volání předáváme adres dat Požíváme pro předávání výstpních parametrů a dále polí (nejde jinak) a velkých strktr void moje_fce(int *data){ int cislo; moje_fce(&cislo); 13