otazky Flashcards

(172 cards)

1
Q

Proč se programy v C rozdělují do hlavičkových souborů (.h) a zdrojových souborů (.c)?

A
  • kvůli přehlednosti - nemusím v každém souboru .c definovat jednu funkci stále znovu, stačí její deklaraci uvést v inkludovaném souboru .h
  • kvůli kompilátoru (je třeba dopředu znát deklarace funkcí a jejich návratovou hodnotu)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Jaký význam má hlavičkový soubor zdrojových souborů programu v C?

A
  • jsou v něm popisy funkcí, funkce samotné a také proměnné, které se sdílejí napříč soubory
  • hlavičkový soubor je includovaný v mainu (je třeba znát pouze použití, ne jejich přímou implementaci)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Jak probíhá překlad a linkování (sestavení) programu v C?

A
  • preprocesor (dosazuje kusy kódu za includy, # makra, vyhazuje komentáře, spojuje řádky dohromady když tam je /). Pokud chceme spustit pouze fázi preprocessingu, přidáme přepínač -E do kompilace.
  • kompilace (kompiluje – převede programátorem napsaný zdrojový kód do spustitelné .o (binární) podoby. To jsou soubory, které již obsahují binární kód. Tento kód ale není spustitelný, protože nemá vyřešené závislosti na jiné části programu (například volání funkce, která je v jiném .c souboru). Je třeba znát deklarace, vkládá jen relativní adresy.
  • linkování (vkládají se absolutní hodnoty adres – proměnné a funkce, výsledkem je spustitelný program). Při kompilování do objektových souborů kompilátor neví, zda volaná funkce existuje a kde je. Použití správných adres v paměti řeší linker.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Vysvětlete rozdíl mezi překladem zdrojových souborů a linkováním programu?

A
  • překlad vkládá jen relativní adresy, kdežto linkování vkládá již absolutní adresy
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Co je to preprocesor a jaká je jeho funkce při překladu zdrojového souboru v jazyce C?

A
  • počítačový program, který zpracovává vstupní data
  • dosazuje kusy kódu a hlídá, jestli nebyl nějaký kus dosazen dvakrát (to
    nelze)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Jaké znáte překladače jazyka C?

A

gcc, clang, tcc, icc

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Jak zajistíme, že se hlavičkový soubor programu v C nevloží při překladu vícekrát?

A
  • pomocí tzv. head guard (hlavičkového strážce)
#ifndef PRG 
#define PRG 
...kod 
#endif
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Popište proces vytvoření spustitelného programu ze zdrojových souborů jazyka C.

A

viz 3.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Jak zajistíte možnost ovlivnit výslednou podobu programu při překladu? Např. Velikost bufferu definovanou symbolickou konstantou?

A
- přidat přepínač -Dbufsize=1234
( obecne : -D name=definition ) + v kódu mít něco jako
#ifndef bufsize
#define bufsize 4321 //vychozi hodnota
#endif
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Jak při překladu programu kompilátorem GCC nebo Clang rozšíříme seznam prohledávaných adresářů s hlavičkovými soubory?

A
  • I
  • gcc -Idir [options ..]
  • gcc -Iproj/src myfile.c -o myfile
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Záleží u kompilace programu kompilátorem GCC nebo Clang při specifikaci adresářů s hlavičkovými soubory na jejich pořadí?

A
  • ano, např. kdybychom linkovali více knihoven.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Co způsobí definování makra preprocesoru NDEBUG v souvislosti s používáním funkce assert?

A
  • dojde k tomu, že si přestane všímat funkce assert, tudíž program nespadne v pripade nesplneni podminky ve výrazu assert(condition)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Jaký tvar má hlavní funkce programu v C, která se spustí při spuštění programu prostředí s operačním systémem?

A

int main(){}

int main(int argc, char *argv[]){}

 main ( int argc, char **argv ) {
// code
return 0; // Indicates that everything went well. 
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Jakou návratovou hodnotou programu v C indikujete úspěšné vykonání a ukončení programu? Proč zvolíte právě tuto hodnotu?

A
  • return 0;
  • nula je jen jedna a také protože to značí 0 chyb
  • Je taky možné použít EXIT_SUCCESS a EXIT_FAILURE ktere jsou
    definované v stdlib.h
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Jak předáváme parametry programu implementovanému v jazyce C?

A
  • argumenty

- pomocí příkazové řádky (zvýší se hodnota argc a zapíše se to do argv pole)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Existuje nějaká jiná možnost jak předat uživatelské parametry programu jinak než jako argument programu?

A
  • ano, například načíst ze standardního vstupu pomocí příkazu scanf (nebo podobných)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Jaký je rozdíl mezi staticky a dynamicky linkovaným programem implementovaným v jazyce C?

A
  • staticky – každá část se zkompiluje samostatně a pak se spojí do jednoho
  • dynamicky – operační systém si je zavolá až v momentě, kde je bude potřebovat v tom souboru, nejsou přímo zakompilované v binárce
  • staticky linked program = lépe přenosný
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Linkují ve výchozím nastavení překladače GCC nebo Clang statické nebo dynamické binární spustitelné soubory?

A
  • standardní knihovny se linkují dynamicky a mé vlastní knihovny staticky
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Jak vkládáme do zdrojového souboru programu v C hlavičkové soubory jiných modulů nebo knihoven?

A
#include (pro standardní knihovny)
#include “...” (nejčastěji se používá pro vlastni knihovny)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Jaký rozdíl mezi použitím #include a #include “soubor.h”?

A
#include 
#include “hledá jak ve standardních knihovnách, tak u mě ve složce ”
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Popište rozdíl mezi deklarací a definicí funkce v jazyce C?

A
  • deklarací pouze řekneme, že zde tato funkce bude (zadáme spolu s parametry) ; Musíme určit jméno funkce, vstupní parametry a návratovou hodnotu.
    – definice už je přímo celá funkce – {}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Jak jsou předávány parametry funkci v jazyce C?

A
  • hodnota či reference se zkopíruje na stack (reference – hodnota pointeru) 2 možnosti : Pass by Value a Pass by Reference = neexistuje v cecku, pouze pass by value (pointer = integer s adresou)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Co je to literál a co tímto pojmem označujeme?

A

int a = 5 –> 5 je literál

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Jak lze v jazyce C realizovat předání parametru funkci odkazem?

A
  • ccko je striktně pass by value, takže nijak
  • pass by reference jen emulováno pomocí ukazatelů
  • Obecně: Ukazatele jsou proměnné, které uchovávají adresu ukazující do paměti počítače, kde je uložená konkretní proměnná.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Jak lze v jazyce C omezit viditelnost funkce pouze v rámci jednoho modulu (souboru .c)?
static názevfunkce
26
Je možné v jazyce C volat funkci ze sebe sama (rekurze)?
ano
27
Při volání funkce v jazyce C jsou předávány argumenty funkce, které se stanou lokálními proměnnými. V jaké části paměti jsou tyto lokální proměnné při běhu programu uloženy?
- na stacku - Stack se používá pro staticky allokovanou paměť -> lokální proměnné, pote co je funkce dokončená, tak je místo vyhrazené pro lokální proměnné uvolněno.
28
Jaké znáte kategorie proměnných z hlediska jejich umístění v paměti?
- lokální proměnné, argumenty funkce a návratové hodnoty jsou na stacku; - dynamicky alokované proměnné na heapu; - globální a statické proměnné na static data (pak případně ještě literály mají svou paměť)
29
Je součástí jazyka C přímá podpora (tj. klíčové/á slovo jazyka) dynamická alokace paměti?
- ne přímo v jazyce C, ale v knihovně stdlib.h, která je součástí standardního C
30
Jak v jazyce C dynamicky alokovat paměť za běhu programu?
- pomocí příkazu malloc() - případně calloc() a realloc() - a free() int *p = malloc(4*sizeof(int)); // array of 4 int
31
Je v jazyce C nutné uvolňovat dynamicky alokovanou paměť? Pokud ano, jak to uděláte?
- ano, pomoci příkazu free()
32
Jak zjistíme velikost reprezentace datových typů v jazyce C?
- pomocí příkazu sizeof()
33
Je vždy v jazyce C velikost proměnné typu int 32 bitů?
- ne, závisí na kompilátoru a na počítači
34
Kdy je velikost ukazatele v jazyce C 32-bitů a kdy 64-bitů?
- závisí na architektuře počítače | - 64-bitový systém by měl používat 64-bitů, 32-bitový 32 bitu apod.
35
Jak funguje modifikátor static při použití v definici lokální proměnné funkce v jazyce C?
- i po ukončení funkce zůstane proměnná na poslední hodnotě uložená na static data
36
Jak funguje modifikátor extern při definici globální proměnné v jazyce C?
- tato proměnná bude vidět ve všech modulech
37
Jaké znáte základní znaménkové celočíselné typy v jazyce C?
- int, long, long long, short | - signed char (-128 až 127)
38
Rozlišuje jazyk C znaménkové a neznaménkové celočíselné typy? Pokud ano, co z toho plyne?
- ano (unsigned a signed) | - při aritmetice se počítá jen s kladnými čísly
39
Jaké znáte neceločíselné typy v jazyce C? Jaká je jejich vnitřní reprezentace (velikost)?
- float (32 bit), double (64 bit) | - mantisa a exponent
40
Jsou v jazyce C definovány rozsahy neceločíselných typů?
- nejsou, jediná podmínka – double musí být 2x větší než float
41
Jsou v jazyce C definovány rozsahy celočíselných typů?
- liší se podle architektury počítače, ano i ne, pravidla: | short menší než int, int menší než long
42
Jak v C zajistíte proměnné celočíselného typu s konkrétním požadovaným rozsahem (tj. velikostí datové reprezentace)?
- pomocí uint16_t a dalších | - musí být includovaná knihovna
43
Je součástí jazyka C typ logické hodnoty ,,true/false''? Pokud ano, jak se používá? Pokud ne, jak jej definujete?
- ano = "_Bool", ale radši a bool
44
Jak v C definujete ukazatel na proměnnou, např. typu int?
int a = 5; | int *b = &a;
45
Jaké jsou v C omezení pro názvy proměnných a funkcí?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem, délka
46
Jaké znáte escape sekvence používané v C pro řídicí znaky?
- \n \r \t \v \b \f \a (new line , carriage return, horizontal tab, vertical tab, backspace, form feed, alert) - \0 = NULL
47
Jak jsou v C reprezentovány textové řetězce?
- pole charů, které má na konci \0. Pole s řetězcem tedy musí být vždy o 1 delší, než je délka textu, který do něj vkládáme
48
Jak v C zapisujeme identifikátory (jména funkcí a proměnných)?
- nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem
49
Jakými dvěma způsoby lze v C vytvářet konstanty?
- definovat je jako macro | - pomocí const
50
Popište výčtový typ jazyka C. Uveďte vlastnosti, které považujete za důležité?
- enum - Konstanty výčtového typu jsou vždy celočíselné. Pokud konstantě nepřiřadíte hodnotu, pak má hodnotu o jednotku vyšší, než konstanta předešlá. - např. leden = 1 .. zbytek se přiřadí sám
51
Jaké znáte logické operátory jazyka C? Jak se zapisují?
&& (and) || (or) ! (negation)
52
Jaké znáte bitové operátory jazyka C? Jak se zapisují?
``` >> (logical right shift) << & (logical and) ^ (exclusive or) (XOR) ~ (inverse)(NOT) | (logical or) ```
53
Jak v C realizujete dělení a násobení dvěma s využitím operátorů bitového posunu?
- násobení – napr. posunu bitově o dva doleva i<<1 | - dělení – napr. posunu bitově o dva doprava i>>1
54
Jak v C definujete složený typ (struct)?
struct my_struct_s{ int a; } voláme: struct my_struct_s A;
55
Jak zavedeme nový typ struktury, např. pojmenovaný my_struct_s.
``` typedef struct { // code } my_struct_s; voláme: my_struct_s A; ```
56
Kdy nemusíme psát před identifikátor určující jméno/typ struktury klíčové slovo struct?
- když použijeme typedef
57
Co je v jazyce C pointerová (ukazatelová) aritmetika a jak se používá?
- jedná se o aritmetiku ukazatelů (tedy proměnných, které ukazují na adresu jiné proměnné)
58
Jak se v C liší proměnná typu ukazatel a typu pole[] (VLA - pole variabilní délky)?
- pole je ukazatel na první prvek “pole”: int pole[50]; pole je pak ukazatelem na: &pole[0] - pole[1] = *(pole+1)
59
Jak v C přistupujeme k datovým položkám složeného typu (struct)?
pomocí tečky (.)
60
Uveďte příklad přístupu k položkám proměnné složeného typu (struct) a proměnné typu ukazatel na složený typ.
- msg.data | - msg->data
61
Jaký v C rozdíl mezi typy struct a union?
``` Struct: - pamět pro každého člena = velikost součet nebo větší všech členů - změna hodnoty neovlivní ostatní čl. - víc inicializací najednou Union: - šetří pamět - jen největší člen - změna hodnoty změní ostatní čl. - přístup jen k jednomu členu v daný čas ```
62
Stručně popište typ union používaný v jazyce C.
Union: - šetří pamět - jen největší člen - změna hodnoty změní ostatní čl. - přístup jen k jednomu členu v daný čas - syntaxe jako struct
63
Jak se v jazyce C používá operátor přetypování?
- napíšeme před výraz do závorky typ, na který chceme přetypovat (int)promenna - nelze vždy
64
Co v C reprezentuje typ void?
- speciální datový typ, kdy se při návratu neposkytuje do volajícího výrazu žádná návratová hodnota - "žádná data" (datový typ pouze pro organizaci)
65
Co v C reprezentuje typ void*?
- Deklaruje ukazatel, ale bez zadání typu dat, na který ukazuje. (takže můžeme použít přetypovani jako např. u (int*)malloc(...), jelikož malloc taky vrací void*)
66
Jak v C realizujete opuštění dvou nebo více vnořených cyklů z nejvnitřnějšího cyklu?
- horní mez, goto, break, stavy, return, !quit podmínka
67
Co v C reprezentuje identifikátor NULL?
- jedná se o konstantu, která udává, že pointer je prázdný a že zrovna na nic neukazuje
68
Jak nastavíte proměnnou typu ukazatel na prokazatelně neplatnou hodnotu?
= 0 anebo = NULL
69
Napište základní tvar hlavní funkce main, která se používá v C programech? Uveďte další možné tvary.
``` int main(){} int main(int argc, char *argv[]){} ``` ``` main ( int argc, char **argv ) { // code return 0; } ```
70
Jak v C zapíšete konstantní ukazatel na konstantní hodnotu, např., typu double?
const double * const ptr;
71
Co je v C ukazatel na funkci? K čemu slouží a jak definujete proměnou typu ukazatel na funkci?
int (*functionPtr)(int,int); functionPtr = &addInt; int sum = (*functionPtr)(2, 3);
72
Je v C rozdíl definovat složený typ pouze jako struct a prostřednictvím typedef struct? Pokud ano, tak jaký?
- Je rozdíl ve volání struktury. Když definujeme pomoci typedef, pak nemusíme psát klíčové slovo struct v definici.
73
Můžeme v C při definici proměnné typu pole, proměnnou přímo inicializovat? Pokud ano, jak?
- ano, např.: int pole[] = { 0, 0, 0, 0}; int myArray[10] = { 0 }; char array[255]=”Hello”;
74
Můžeme v C při definici proměnné typu struct inicializovat pouze určitou položku?
- ne, při definici nemůžeme inicializovat nic. Pouze při inicializaci!
75
Jakou funkcí v C vytisknete na obrazovku formátovaný znakový výstup? V jaké standardní knihovně je funkce definována?
printf(); - taky fprintf(stdout,”smth”) - knihovna
76
Jak v C načtete hodnotu textového řetězce a celého čísla od uživatele?
``` - Celé číslo: int a; scanf("%d", &a) - Text.: char pole[255] fgets (pole, 255, stdin); ```
77
Jak v C vytisknete textový řetězec na standardních výstup a standardní chybový výstup? Jakou funkci k tomu použijete?
- fprintf(stderr, “....”); | - fprintf(stdout, “....”) - stejný výsledek jako printf(“....”);
78
V jakém kontextu se používá klíčové slovo break?
- slouží k opuštění těla cyklu nebo příkazu switch
79
V jakém kontextu se používá klíčové slovo case?
- označuje jednu “možnost” v příkazu switch
80
V jakém kontextu se používá klíčové slovo continue?
- Program skočí na začátek cyklu a zvýší se iterace (tj. pokracuje se dal v cyklu (pokud není porušena podmínka průběhu cyklu))
81
V jakém kontextu se používá klíčové slovo default?
- při použití switch, abychom ošetřili situaci, kdy se nesplní ani jeden case
82
V jakém kontextu se používá klíčové slovo do?
- pro použití do...while smyčky, vykoná se aspoň jednou podmínka je na konci
83
V jakém kontextu se používá klíčové slovo while?
- while (podmínka) {} | - pro vytvoření cyklu, lze i nekonečný cyklus (while(1){}
84
V jakém kontextu se používá klíčové slovo for?
- for cyklus, nejčastěji když známe přesný počet opakování | - for(int i = 0; i < hranice; ++i) {}
85
Jaké bloky pro řízení cyklu definuje for cyklus?
for(inicializace; test podmínky; aktualizace proměnné){}
86
Jaký význam má uvedení specifikátoru register?
- klíčové slovo registr říká překladači (kompilátorů), že daná proměnná se může uložit do registru – rychlejší přístup než do paměti. Kompilátor sám zvolí zda ji uloží do registru nebo ne.
87
Kdy lze použít příkaz skoku goto?
- třeba když chci vyskočit z několika vnořených cyklů | - nepřehledný, nedoporučuje se
88
Co vrací operátor sizeof?
- velikost datového typu v bajtech
89
Lze použít proměnnou jako argument operátoru sizeof?
ano
90
Jak můžeme zjistit konkrétní velikost určitého datového typu? Např. celočíselný int nebo short.
sizeof(int) | sizeof(short)
91
Jak zajistíme, že lokální proměnná ve funkci si zachová hodnotu i při opuštění funkce?
- pomoci keyword static
92
Co reprezentuje klíčové slovo void?
- void funkce nemá návratovou hodnotu, void* ukazuje na libovolný datový typ
93
Jak definujete konstantní hodnotu typu float?
- const float a = 1.5; (jedna se defakto o definici spojenou s inicializaci, rozdelit tyto procesy by nedavalo smysl)
94
Jak rozlišíte literál typu float a double?
- podle velikosti. float 32 má 32 bitu, double 64 (obecne je double vzdy 2x vetsi nez float, 32 bitu neni zaruceno, zalezi na standardech)
95
Jak rozlišíte literál typu int a long?
- literál pro long zápisu long a = 156l;
96
Jak vytisknete hodnotu ukazatele int *p na standardní výstup? Jaký formátovací příkaz v printf použijete?
%p | printf(“%p”, p);
97
Jak vytisknete hodnotu proměnné typu int, na kterou odkazuje ukazatel deklarovaný jako int *p;?
printf(“%d”, *p);
98
Jak získáte ukazatel na proměnnou definovanou jako double d = 12.3?
double *dp = &d;
99
Jak přistoupit na položku number proměnné data typu struktura?
data.number;
100
Jak přistoupit na položku number proměnné data typu ukazatel na strukturu?
data->number;
101
K čemu slouží modifikátor const?
- určíme tím, že daná proměnná je neměnná, označíme ji za konstantu, překladač hlídá abychom do nich nepřiřazovali novou hodnotu -> nedovolí ji změnit
102
Jak se v C předává pole funkcím?
- jako ukazatel na první položku pole
103
Je velikost paměťové reprezentace typu struct vždy součet velikostí typů jednotlivých položek?
- Ne, každá položka musí být v paměti řádně zarovnána a tak mohou vzniknout “hluchá” místa -> padding
104
Podporuje jazyk C přetěžování jmen funkcí? Pokud ano, od jaké verze?
- Ne. Podporuje to pouze C++ za předpokladu odlišení funkcí na základě odlišnosti v počtu nebo typech parametrů
105
Jak probíhá proces spuštění programu implementovaného v jazyce C?
- V sekundární paměti počítače(hard disk). Po spuštění programu je celý zkopírován do paměti RAM. Potom procesor načte několik instrukcí (záleží na velikosti sběrnice) najednou, umístí je do registrů a provede je.
106
Popište jak v C probíhá volání funkce int doit(int r)? Jaká data jsou předávána do/z funkce a kam jsou hodnoty ukládány?
- do funkce vstupuje: int, z funkce: int, ukladaji se na stack
107
Vysvětlete rozdíl mezi proměnnou a ukazatelem na proměnnou v jazyce C?
- proměnná je uložená na určité adrese a má nějakou hodnotu - ukazatel na proměnnou odkazuje na adresu, na které je uložená pointer je premenna typu pointer, je to len 32/64bit cislo s adresou kterou tam dame
108
Jaký je v C rozdíl mezi ukazatelem na konstantní proměnnou a konstantním ukazatelem? Jak definice těchto ukazatelů zapisujeme?
const char* myPtr = &a; char *const myPtr, - nemůžeme změnit kam tento pointer ukazuje
109
Jak v C dynamicky alokujete paměť pro uložení posloupnosti 20 hodnot typu data_t ? Jak následně takové dynamické pole zvětšíte pro uložení dalších 10 položek?
``` data_t *data = (data_t *)malloc(20 * sizeof(data_t)); data_t *tmp = (data_t*)realloc(data, 30 * sizeof(data_t)); if (tmp != NULL) { //včetně ověření dostatku paměti data = tmp; } ```
110
Jak v C zajistíte načtení textového řetězce ze souboru aniž byste překročili alokovanou paměť určenou pro uložení řetězce?
- postupnou realokací/dynamickou alokací
111
Vysvětlete jaký je v C rozdíl mezi proměnnou typu ukazatel, proměnnou a polem z hlediska uložení hodnoty v paměti?
- Pole je ukazatel na první prvek pole, ukazatel je adresa na které je uložena proměnná na kterou odkazuje. - lokalni promenne------->stack - globální proměnné ------->static - ukazatele na stacku, pamět na heapu
112
Vyjmenujte základní paměťové třídy, ve kterých mohou být uloženy hodnoty proměnných.
auto (stack) static (datové oblasti) extern (datové oblasti) register (jeli dovoleno překladačem umístněy v registru)
113
Jaký je v C rozdíl mezi ukazatelem na hodnotu int a polem hodnot int, tj. int *p a int p[]?
- sizeof (array) vrátí množství paměti použité všemi prvky v poli - sizeof (ukazatel) pouze vrací množství paměti použité samotnym ukazatelem - & (array) je stejne jako &pole[0] a vrátí adresu prvního prvku v poli - & (ukazatel) vrátí adresu ukazatele
114
Jaký význam má klíčové slovo static v závislosti na kontextu?
- static fce a static proměnná - bude mít vnitřní linkování a nebude viditelné z ostatních modulů - Statická proměnná uvnitř funkce nechává svoji hodnotu po skončení funkce.
115
Definujte pole variabilní délky o velikosti n, kterou načtete ze standardního vstupu.
int n = 0; scanf(“%d”, &n); int pole[n];
116
Definujte diagonální (jednotkovou) matici 3×3 jako 2D pole typu int.
- int Array[3][3]={{1,0,0},{0,1,0},{0,0,1}};
117
Garantuje uvedení const u definice proměnné, že není žádná možnost jak příslušnou hodnotu proměnné změnit?
- ne, lze změnit hodnotu pomoci pointeru
118
Je v C možné použít příkaz nepodmíněného skoku goto ke skoku z jedné funkce do jiné? Pokud ne, proč?
- Nemůžete v Standardnim C; labely jsou pouze lokální (pro jednu funkci).
119
Popište k čemu slouží příkaz dlouhého skoku (longjmp/setjmp) v C. Jak se používá?
- setjump si zapamatuje pozici a nastaví tam jmp_buf - longjmp skoci na jmp_buf - slouží ke skoku mezi funkcemi
120
Vyjmenujte základní rozdělení paměti přidělené spuštěnému programu z hlediska kódu, proměnných a literálů?
stack, heap, static data, literals
121
Vyjmenujte (čtyři) specifikátory paměťové třídy (Storage Class Specifiers).
auto,static,register,extern
122
Jaké typy paměti dle způsobu alokace rozlišujeme v jazyce C?
- Staticky(stack) a dynamicky(heap) alokovaná.
123
Definujte nový typ, který umožní sdílet paměť pro proměnnou typu double, nebo proměnnou typu int.
typedef union { double doub; int integer; } sharing_int_double;
124
Co znamená klíčové slovo volatile?
- Volatile určuje, že proměnná bude vždy na stejném místě v paměti (například nebude se ukládat do cache apod.)
125
Jaký význam má klíčové slovo extern dle kontextu?
- pro funkce – extern je zahrnut i když jej nepíšeme | - pro proměnné - pouze deklarujeme nebude vyhrazená paměť pro ně, zviditelňuje proměnnou pro celý program
126
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro vstup a výstup?
stdio.h
127
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány nejběžnější funkce std. knihovny?
stdlib.h
128
V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro práci s textovými řetězci?
string.h
129
Co je errno a v jakém hlavičkovém souboru standardní knihovny C je deklarováno?
extern int errno; | - ze zacatku je errno=0, v případě úspěšného bezchybného vykonání programu se nemění
130
Jakým způsobem jsou předávány nebo jinak ukládány chybové stavy ve většině funkcí standardní knihovny C?
- funkce vraci hodnotu -1 nebo NULL nebo EOF | - EXIT_SUCCESS a EXIT_FAILURE Defined in header
131
K čemu slouží makro assert a v jakém je hlavičkovém souboru standardní knihovny C?
- umožňuje zápis diagnostických informací na standardní chybový výstup, tedy zjednodusuje debuggovani
132
Ve kterém hlavičkovém souboru standardní knihovny C jsou definovány matematické funkce?
math.h
133
Ve kterém hlavičkovém souboru standardní knihovny C byste hledali rozsahy základní číselných typů?
stdint.h
134
Jakým způsobem otevřete soubor pro čtení? Napište krátký (1-3 řádkový) kód?
FILE* soubor= fopen(”text.txt“, “r”);
135
Jakým způsobem otevřete soubor pro zápis? Napište krátký (1-3 řádkový) kód?
FILE* soubor = fopen(”text.txt“, “w”);
136
Proč je vhodné explicitně zavírat otevřený soubor? Jakou funkci standardní knihovny C k tomu použijete?
fclose() | - Aby došlo k uvolnění paměti, kterou zabírá soubor.
137
Jak zjistíte, že jste při čtení souboru dosáhli konce souborů? Jakou funkci standardní knihovny C k tomu můžete použít?
- př. funkcí (int feof(FILE *stream)), která vrátí na konci souboru nenulovou hodnotu - stdio.h
138
Jak zjistíte podrobnosti o selhání čtení/zápisu z/do souboru s využitím funkcí standardní knihovny C?
podle return value funkce, | size_t fwrite ..
139
Jak rozlišíte chybu a dosažení konce souboru při neúspěchu čtení ze souboru, např. funkcí fscanf()?
- pomocou feof()
140
Jaké znáte funkci/e standardní knihovny C pro náhodný přístup k souborům?
fseek(FILE *stream, long int offset, int whence)
141
Jaké znáte funkce standardní knihovny C pro blokové čtení a zápis?
``` size_t fread(void *ptr...) size_t fwrite(const void *ptr...) ```
142
Co je to proces v terminologii operačního systému?
- proces = instance programu, který je právě spuštěn operačním systémem ve vyhrazeném prostoru paměti - může se skládat z jednoho nebo více vláken - procesy jsou využívány operačním systémem pro oddělení různých běžících aplikací
143
Budete se snažit svůj program paralelizovat i když máte pouze jeden procesor? Svou odpověď zdůvodněte.
Ano, i na jednom procesu může běžet simultálně více vláken, organizace programu, zpracování soketů na webu
144
Jaké základní operace související s paralelním programováním (více procesové/vláknové) řeší programovací jazyky s explicitní podporou paralelismu?
- tvorba a rušení procesů - správa více procesorů a procesu, rozvrhování - systém sdílené paměti - synchronizace procesů
145
Jaké entity (operačního systému) slouží k řízení přístupu ke sdíleným zdrojům)?
?
146
Jak lze standardní vstup a výstup využít pro komunikaci mezi procesy?
?
147
Co je to vlákno (thread)?
- samostatně prováděný výpočetní tok - běží v rámci procesu - jednoho procesu běží v rámci stejného prostoru paměti - každé vlákno vyhrazený prostor pro spec. proměnné
148
Jaký je rozdíl mezi vláknem a procesem?
Proces / Vlákno: Vlastní paměťový prostor / společný. Entita OS / Uživatelská nebo os entita Časová náročnost proces / méně náročné
149
Co musí úloha splňovat, aby mělo smysl uvažovat o vícevláknové architektuře aplikace (obecně, ne konkrétní typ aplikací)?
- reakce na asynchronní události - větší kvanta dat - nezávislé podúlohy
150
Jaké výhody má vícevláknová aplikace oproti víceprocesové aplikaci?
- Snadnější a rychlejší komunikace mezi vlákny (stejný pam. prostor) - aplikace je interaktivnější
151
Je aplikace s interaktivním rozhraním vhodným kandidátem pro vícevláknovou aplikaci a proč?
- ano, procesy nesníží interaktivitu | - okamžitá odpověd ++
152
Kdy nemá smysl použití více vláken pro aplikaci s uživatelským rozhraním?
?
153
Má smysl vyvíjet vícevláknové aplikace pro systémy s jediným CPU a proč?
- ano, možnost lépe využít početní výkon | - možná zrychlit aplikaci
154
Kde se mohou nacházet vlákna z hlediska řízení přidělování procesoru?
?
155
Jak jsou rozvrhována vlákna řešená uživatelskou knihovnou a co to znamená z hlediska priority vláken?
?
156
Jaké modely vícevláknových aplikací znáte?
- boss/worker - pipeline - peer - producer/consumer
157
Co je to Thread Pool a k čemu je dobrý?
- zásobárna předpřipravených vláken, která čekají na úkoly od hlavního vlákna. Nemusí se díky němu neustále inicializovat nová vlákna.
158
Jak snížíte nároky opakovaného vytváření vláken?
- využitím Thread Pool
159
Jaké vlastnosti sledujeme při návrhu struktury Thread Pool?
- počet předpřipravených vláken - maximální počet požadavků ve frontě požadavků - co se má stát, když je fronta plná a žádné z vláken není k dispozici
160
Jakou architekturu vícevláknové aplikace použijete v případě zpracování proudu dat?
pipeline
161
Jaké vlastnosti musí splňovat proudové zpracování dat, aby bylo výhodné použít více vláken?
- předpoklady: proud dat, určitá vlákna pracují paralelně na různých částech ‘proudu’ dat
162
Jak předáváme data mezi vlákny v úloze producent/konzument?
- pomocí memory bufferu nebo jen pomocí bufferu referencí (pointerů) na konkrétní datové jednotky
163
Jaké je základní primitivum synchronizace více vláken?
pthread_mutex_lock | pthread_mutex_unlock
164
Jaké znáte primitiva pro synchronizaci více vláken?
pthread_cond_signal pthread_cond_wait pthread_cond_broadcast
165
Kdy říkáme, že je funkce reentrantní?
- když můžeme být funkce v průběhu přerušena a pak bezpečně znova zavolána, nepíše do static data a nepracuje s globálními daty
166
Co je to thread-safe funkce?
- jedno či více vláken může vykonat stejnou část kódu bez toho aby způsobily synchronizační problémy
167
Jak dosáhneme reentrantní funkce?
- tak, že tato funkce nebude zapisovat do static data a nepracuje s globálními proměnnými
168
Jak dosáhneme thread-safe funkce?
- tak, že tato funkce bude mít přímý přístup ke globálním datům za použití synchronizačních primitiv
169
Jaké hlavní synchronizační problémy se objevují u vícevláknových aplikací?
deadlock | race condition
170
Co je to problém uváznutí (deadlock)?
- když pro dokončení první operace je potřeba dokončit operaci druhou a naopak → zacyklení se, čekají jedna na druhou
171
Co je to problém souběhu (race conditions) u vícevláknové aplikace?
- jedná se o přístup více vláken ke sdílenému zdroji, kdy alespoň jedno z nich nepoužívá synchronizační mechanismus - zápis a čtení nejsou atomické
172
Jak se lze vyhnout problému uváznutí (“dead-lock”) u vícevláknové aplikace?
- zamykat proměnné vždy ve stejném pořadí (spraví většinu problémů), jinak žádné 100% pravidlo neexistuje