otazky Flashcards

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
Q

Jak lze v jazyce C omezit viditelnost funkce pouze v rámci jednoho modulu (souboru .c)?

A

static názevfunkce

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

Je možné v jazyce C volat funkci ze sebe sama (rekurze)?

A

ano

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

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?

A
  • 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.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Jaké znáte kategorie proměnných z hlediska jejich umístění v paměti?

A
  • 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ěť)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Je součástí jazyka C přímá podpora (tj. klíčové/á slovo jazyka) dynamická alokace paměti?

A
  • ne přímo v jazyce C, ale v knihovně stdlib.h, která je součástí standardního C
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Jak v jazyce C dynamicky alokovat paměť za běhu programu?

A
  • pomocí příkazu malloc() - případně calloc() a realloc() - a free()
    int p = malloc(4sizeof(int)); // array of 4 int
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Je v jazyce C nutné uvolňovat dynamicky alokovanou paměť? Pokud ano, jak to uděláte?

A
  • ano, pomoci příkazu free()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Jak zjistíme velikost reprezentace datových typů v jazyce C?

A
  • pomocí příkazu sizeof()
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Je vždy v jazyce C velikost proměnné typu int 32 bitů?

A
  • ne, závisí na kompilátoru a na počítači
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Kdy je velikost ukazatele v jazyce C 32-bitů a kdy 64-bitů?

A
  • závisí na architektuře počítače

- 64-bitový systém by měl používat 64-bitů, 32-bitový 32 bitu apod.

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

Jak funguje modifikátor static při použití v definici lokální proměnné funkce v jazyce C?

A
  • i po ukončení funkce zůstane proměnná na poslední hodnotě uložená na static data
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Jak funguje modifikátor extern při definici globální proměnné v jazyce C?

A
  • tato proměnná bude vidět ve všech modulech
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Jaké znáte základní znaménkové celočíselné typy v jazyce C?

A
  • int, long, long long, short

- signed char (-128 až 127)

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

Rozlišuje jazyk C znaménkové a neznaménkové celočíselné typy? Pokud ano, co z toho plyne?

A
  • ano (unsigned a signed)

- při aritmetice se počítá jen s kladnými čísly

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

Jaké znáte neceločíselné typy v jazyce C? Jaká je jejich vnitřní reprezentace (velikost)?

A
  • float (32 bit), double (64 bit)

- mantisa a exponent

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

Jsou v jazyce C definovány rozsahy neceločíselných typů?

A
  • nejsou, jediná podmínka – double musí být 2x větší než float
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

Jsou v jazyce C definovány rozsahy celočíselných typů?

A
  • liší se podle architektury počítače, ano i ne, pravidla:

short menší než int, int menší než long

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

Jak v C zajistíte proměnné celočíselného typu s konkrétním požadovaným rozsahem (tj. velikostí datové reprezentace)?

A
  • pomocí uint16_t a dalších

- musí být includovaná knihovna

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

Je součástí jazyka C typ logické hodnoty ,,true/false’’? Pokud ano, jak se používá? Pokud ne, jak jej definujete?

A
  • ano = “_Bool”, ale radši a bool
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

Jak v C definujete ukazatel na proměnnou, např. typu int?

A

int a = 5;

int *b = &a;

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

Jaké jsou v C omezení pro názvy proměnných a funkcí?

A
  • nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem, délka
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
46
Q

Jaké znáte escape sekvence používané v C pro řídicí znaky?

A
  • \n \r \t \v \b \f \a (new line , carriage return, horizontal tab, vertical tab, backspace, form feed, alert)
  • \0 = NULL
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
47
Q

Jak jsou v C reprezentovány textové řetězce?

A
  • 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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
48
Q

Jak v C zapisujeme identifikátory (jména funkcí a proměnných)?

A
  • nesmí začínat číslem; obsahuje pouze pismena, cisla a _ , nesmí se shodovat s klíčovým slovem
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
49
Q

Jakými dvěma způsoby lze v C vytvářet konstanty?

A
  • definovat je jako macro

- pomocí const

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

Popište výčtový typ jazyka C. Uveďte vlastnosti, které považujete za důležité?

A
  • 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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
51
Q

Jaké znáte logické operátory jazyka C? Jak se zapisují?

A

&& (and)
|| (or)
! (negation)

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

Jaké znáte bitové operátory jazyka C? Jak se zapisují?

A
>> (logical right shift)
<<
&amp; (logical and)
^ (exclusive or) (XOR)
~ (inverse)(NOT)
| (logical or)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
53
Q

Jak v C realizujete dělení a násobení dvěma s využitím operátorů bitového posunu?

A
  • násobení – napr. posunu bitově o dva doleva i«1

- dělení – napr. posunu bitově o dva doprava i»1

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

Jak v C definujete složený typ (struct)?

A

struct my_struct_s{
int a;
}
voláme: struct my_struct_s A;

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

Jak zavedeme nový typ struktury, např. pojmenovaný my_struct_s.

A
typedef struct {
 // code
} my_struct_s;
voláme:  my_struct_s A;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
56
Q

Kdy nemusíme psát před identifikátor určující jméno/typ struktury klíčové slovo struct?

A
  • když použijeme typedef
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
57
Q

Co je v jazyce C pointerová (ukazatelová) aritmetika a jak se používá?

A
  • jedná se o aritmetiku ukazatelů (tedy proměnných, které ukazují na adresu jiné proměnné)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
58
Q

Jak se v C liší proměnná typu ukazatel a typu pole[] (VLA - pole variabilní délky)?

A
  • pole je ukazatel na první prvek “pole”: int pole[50]; pole je pak ukazatelem na: &pole[0]
  • pole[1] = *(pole+1)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
59
Q

Jak v C přistupujeme k datovým položkám složeného typu (struct)?

A

pomocí tečky (.)

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

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.

A
  • msg.data

- msg->data

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

Jaký v C rozdíl mezi typy struct a union?

A
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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
62
Q

Stručně popište typ union používaný v jazyce C.

A

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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
63
Q

Jak se v jazyce C používá operátor přetypování?

A
  • napíšeme před výraz do závorky typ, na který chceme přetypovat (int)promenna
  • nelze vždy
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
64
Q

Co v C reprezentuje typ void?

A
  • 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)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
65
Q

Co v C reprezentuje typ void*?

A
  • 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)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
66
Q

Jak v C realizujete opuštění dvou nebo více vnořených cyklů z nejvnitřnějšího cyklu?

A
  • horní mez, goto, break, stavy, return, !quit podmínka
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
67
Q

Co v C reprezentuje identifikátor NULL?

A
  • jedná se o konstantu, která udává, že pointer je prázdný a že zrovna na nic neukazuje
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
68
Q

Jak nastavíte proměnnou typu ukazatel na prokazatelně neplatnou hodnotu?

A

= 0 anebo = NULL

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

Napište základní tvar hlavní funkce main, která se používá v C programech? Uveďte další možné tvary.

A
int main(){}
int main(int argc, char *argv[]){}
main ( int argc, char **argv ) {
// code
return 0; 
}
70
Q

Jak v C zapíšete konstantní ukazatel na konstantní hodnotu, např., typu double?

A

const double * const ptr;

71
Q

Co je v C ukazatel na funkci? K čemu slouží a jak definujete proměnou typu ukazatel na funkci?

A

int (functionPtr)(int,int);
functionPtr = &addInt;
int sum = (
functionPtr)(2, 3);

72
Q

Je v C rozdíl definovat složený typ pouze jako struct a prostřednictvím typedef struct? Pokud ano, tak jaký?

A
  • Je rozdíl ve volání struktury. Když definujeme pomoci typedef, pak nemusíme psát klíčové slovo struct v definici.
73
Q

Můžeme v C při definici proměnné typu pole, proměnnou přímo inicializovat? Pokud ano, jak?

A
  • ano, např.:
    int pole[] = { 0, 0, 0, 0};
    int myArray[10] = { 0 };
    char array[255]=”Hello”;
74
Q

Můžeme v C při definici proměnné typu struct inicializovat pouze určitou položku?

A
  • ne, při definici nemůžeme inicializovat nic. Pouze při inicializaci!
75
Q

Jakou funkcí v C vytisknete na obrazovku formátovaný znakový výstup? V jaké standardní knihovně je funkce definována?

A

printf();

  • taky fprintf(stdout,”smth”)
  • knihovna
76
Q

Jak v C načtete hodnotu textového řetězce a celého čísla od uživatele?

A
- Celé číslo:
int a; 
scanf("%d", &amp;a)
- Text.:
char pole[255]
fgets (pole, 255, stdin);
77
Q

Jak v C vytisknete textový řetězec na standardních výstup a standardní chybový výstup? Jakou funkci k tomu použijete?

A
  • fprintf(stderr, “….”);

- fprintf(stdout, “….”) - stejný výsledek jako printf(“….”);

78
Q

V jakém kontextu se používá klíčové slovo break?

A
  • slouží k opuštění těla cyklu nebo příkazu switch
79
Q

V jakém kontextu se používá klíčové slovo case?

A
  • označuje jednu “možnost” v příkazu switch
80
Q

V jakém kontextu se používá klíčové slovo continue?

A
  • 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
Q

V jakém kontextu se používá klíčové slovo default?

A
  • při použití switch, abychom ošetřili situaci, kdy se nesplní ani jeden case
82
Q

V jakém kontextu se používá klíčové slovo do?

A
  • pro použití do…while smyčky, vykoná se aspoň jednou podmínka je na konci
83
Q

V jakém kontextu se používá klíčové slovo while?

A
  • while (podmínka) {}

- pro vytvoření cyklu, lze i nekonečný cyklus (while(1){}

84
Q

V jakém kontextu se používá klíčové slovo for?

A
  • for cyklus, nejčastěji když známe přesný počet opakování

- for(int i = 0; i < hranice; ++i) {}

85
Q

Jaké bloky pro řízení cyklu definuje for cyklus?

A

for(inicializace; test podmínky; aktualizace proměnné){}

86
Q

Jaký význam má uvedení specifikátoru register?

A
  • 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
Q

Kdy lze použít příkaz skoku goto?

A
  • třeba když chci vyskočit z několika vnořených cyklů

- nepřehledný, nedoporučuje se

88
Q

Co vrací operátor sizeof?

A
  • velikost datového typu v bajtech
89
Q

Lze použít proměnnou jako argument operátoru sizeof?

A

ano

90
Q

Jak můžeme zjistit konkrétní velikost určitého datového typu? Např. celočíselný int nebo short.

A

sizeof(int)

sizeof(short)

91
Q

Jak zajistíme, že lokální proměnná ve funkci si zachová hodnotu i při opuštění funkce?

A
  • pomoci keyword static
92
Q

Co reprezentuje klíčové slovo void?

A
  • void funkce nemá návratovou hodnotu, void* ukazuje na libovolný datový typ
93
Q

Jak definujete konstantní hodnotu typu float?

A
  • const float a = 1.5; (jedna se defakto o definici spojenou s inicializaci, rozdelit tyto procesy by nedavalo smysl)
94
Q

Jak rozlišíte literál typu float a double?

A
  • 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
Q

Jak rozlišíte literál typu int a long?

A
  • literál pro long zápisu long a = 156l;
96
Q

Jak vytisknete hodnotu ukazatele int *p na standardní výstup? Jaký formátovací příkaz v printf použijete?

A

%p

printf(“%p”, p);

97
Q

Jak vytisknete hodnotu proměnné typu int, na kterou odkazuje ukazatel deklarovaný jako int *p;?

A

printf(“%d”, *p);

98
Q

Jak získáte ukazatel na proměnnou definovanou jako double d = 12.3?

A

double *dp = &d;

99
Q

Jak přistoupit na položku number proměnné data typu struktura?

A

data.number;

100
Q

Jak přistoupit na položku number proměnné data typu ukazatel na strukturu?

A

data->number;

101
Q

K čemu slouží modifikátor const?

A
  • 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
Q

Jak se v C předává pole funkcím?

A
  • jako ukazatel na první položku pole
103
Q

Je velikost paměťové reprezentace typu struct vždy součet velikostí typů jednotlivých položek?

A
  • Ne, každá položka musí být v paměti řádně zarovnána a tak mohou vzniknout “hluchá” místa -> padding
104
Q

Podporuje jazyk C přetěžování jmen funkcí? Pokud ano, od jaké verze?

A
  • Ne. Podporuje to pouze C++ za předpokladu odlišení funkcí na základě odlišnosti v počtu nebo typech parametrů
105
Q

Jak probíhá proces spuštění programu implementovaného v jazyce C?

A
  • 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
Q

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?

A
  • do funkce vstupuje: int, z funkce: int, ukladaji se na stack
107
Q

Vysvětlete rozdíl mezi proměnnou a ukazatelem na proměnnou v jazyce C?

A
  • 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
Q

Jaký je v C rozdíl mezi ukazatelem na konstantní proměnnou a konstantním ukazatelem? Jak definice těchto ukazatelů zapisujeme?

A

const char* myPtr = &a;
char *const myPtr,
- nemůžeme změnit kam tento pointer ukazuje

109
Q

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?

A
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
Q

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?

A
  • postupnou realokací/dynamickou alokací
111
Q

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?

A
  • 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
Q

Vyjmenujte základní paměťové třídy, ve kterých mohou být uloženy hodnoty proměnných.

A

auto (stack)
static (datové oblasti)
extern (datové oblasti)
register (jeli dovoleno překladačem umístněy v registru)

113
Q

Jaký je v C rozdíl mezi ukazatelem na hodnotu int a polem hodnot int, tj. int *p a int p[]?

A
  • 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
Q

Jaký význam má klíčové slovo static v závislosti na kontextu?

A
  • 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
Q

Definujte pole variabilní délky o velikosti n, kterou načtete ze standardního vstupu.

A

int n = 0;
scanf(“%d”, &n);
int pole[n];

116
Q

Definujte diagonální (jednotkovou) matici 3×3 jako 2D pole typu int.

A
  • int Array[3][3]={{1,0,0},{0,1,0},{0,0,1}};
117
Q

Garantuje uvedení const u definice proměnné, že není žádná možnost jak příslušnou hodnotu proměnné změnit?

A
  • ne, lze změnit hodnotu pomoci pointeru
118
Q

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č?

A
  • Nemůžete v Standardnim C; labely jsou pouze lokální (pro jednu funkci).
119
Q

Popište k čemu slouží příkaz dlouhého skoku (longjmp/setjmp) v C. Jak se používá?

A
  • setjump si zapamatuje pozici a nastaví tam jmp_buf
  • longjmp skoci na jmp_buf
  • slouží ke skoku mezi funkcemi
120
Q

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ů?

A

stack, heap, static data, literals

121
Q

Vyjmenujte (čtyři) specifikátory paměťové třídy (Storage Class Specifiers).

A

auto,static,register,extern

122
Q

Jaké typy paměti dle způsobu alokace rozlišujeme v jazyce C?

A
  • Staticky(stack) a dynamicky(heap) alokovaná.
123
Q

Definujte nový typ, který umožní sdílet paměť pro proměnnou typu double, nebo proměnnou typu int.

A

typedef union {
double doub;
int integer;
} sharing_int_double;

124
Q

Co znamená klíčové slovo volatile?

A
  • 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
Q

Jaký význam má klíčové slovo extern dle kontextu?

A
  • 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
Q

V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro vstup a výstup?

A

stdio.h

127
Q

V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány nejběžnější funkce std. knihovny?

A

stdlib.h

128
Q

V jakém hlavičkovém souboru standardní knihovny C jsou deklarovány funkce pro práci s textovými řetězci?

A

string.h

129
Q

Co je errno a v jakém hlavičkovém souboru standardní knihovny C je deklarováno?

A

extern int errno;

- ze zacatku je errno=0, v případě úspěšného bezchybného vykonání programu se nemění

130
Q

Jakým způsobem jsou předávány nebo jinak ukládány chybové stavy ve většině funkcí standardní knihovny C?

A
  • funkce vraci hodnotu -1 nebo NULL nebo EOF

- EXIT_SUCCESS a EXIT_FAILURE Defined in header

131
Q

K čemu slouží makro assert a v jakém je hlavičkovém souboru standardní knihovny C?

A
  • umožňuje zápis diagnostických informací na standardní chybový výstup, tedy zjednodusuje debuggovani
132
Q

Ve kterém hlavičkovém souboru standardní knihovny C jsou definovány matematické funkce?

A

math.h

133
Q

Ve kterém hlavičkovém souboru standardní knihovny C byste hledali rozsahy základní číselných typů?

A

stdint.h

134
Q

Jakým způsobem otevřete soubor pro čtení? Napište krátký (1-3 řádkový) kód?

A

FILE* soubor= fopen(”text.txt“, “r”);

135
Q

Jakým způsobem otevřete soubor pro zápis? Napište krátký (1-3 řádkový) kód?

A

FILE* soubor = fopen(”text.txt“, “w”);

136
Q

Proč je vhodné explicitně zavírat otevřený soubor? Jakou funkci standardní knihovny C k tomu použijete?

A

fclose()

- Aby došlo k uvolnění paměti, kterou zabírá soubor.

137
Q

Jak zjistíte, že jste při čtení souboru dosáhli konce souborů? Jakou funkci standardní knihovny C k tomu můžete použít?

A
  • př. funkcí (int feof(FILE *stream)), která vrátí na konci souboru nenulovou hodnotu
  • stdio.h
138
Q

Jak zjistíte podrobnosti o selhání čtení/zápisu z/do souboru s využitím funkcí standardní knihovny C?

A

podle return value funkce,

size_t fwrite ..

139
Q

Jak rozlišíte chybu a dosažení konce souboru při neúspěchu čtení ze souboru, např. funkcí fscanf()?

A
  • pomocou feof()
140
Q

Jaké znáte funkci/e standardní knihovny C pro náhodný přístup k souborům?

A

fseek(FILE *stream, long int offset, int whence)

141
Q

Jaké znáte funkce standardní knihovny C pro blokové čtení a zápis?

A
size_t fread(void *ptr...)
size_t fwrite(const void *ptr...)
142
Q

Co je to proces v terminologii operačního systému?

A
  • 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
Q

Budete se snažit svůj program paralelizovat i když máte pouze jeden procesor? Svou odpověď zdůvodněte.

A

Ano, i na jednom procesu může běžet simultálně více vláken, organizace programu, zpracování soketů na webu

144
Q

Jaké základní operace související s paralelním programováním (více procesové/vláknové) řeší programovací jazyky s explicitní podporou paralelismu?

A
  • tvorba a rušení procesů
  • správa více procesorů a procesu, rozvrhování
  • systém sdílené paměti
  • synchronizace procesů
145
Q

Jaké entity (operačního systému) slouží k řízení přístupu ke sdíleným zdrojům)?

A

?

146
Q

Jak lze standardní vstup a výstup využít pro komunikaci mezi procesy?

A

?

147
Q

Co je to vlákno (thread)?

A
  • 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
Q

Jaký je rozdíl mezi vláknem a procesem?

A

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
Q

Co musí úloha splňovat, aby mělo smysl uvažovat o vícevláknové architektuře aplikace (obecně, ne konkrétní typ aplikací)?

A
  • reakce na asynchronní události
  • větší kvanta dat
  • nezávislé podúlohy
150
Q

Jaké výhody má vícevláknová aplikace oproti víceprocesové aplikaci?

A
  • Snadnější a rychlejší komunikace mezi vlákny (stejný pam. prostor)
  • aplikace je interaktivnější
151
Q

Je aplikace s interaktivním rozhraním vhodným kandidátem pro vícevláknovou aplikaci a proč?

A
  • ano, procesy nesníží interaktivitu

- okamžitá odpověd ++

152
Q

Kdy nemá smysl použití více vláken pro aplikaci s uživatelským rozhraním?

A

?

153
Q

Má smysl vyvíjet vícevláknové aplikace pro systémy s jediným CPU a proč?

A
  • ano, možnost lépe využít početní výkon

- možná zrychlit aplikaci

154
Q

Kde se mohou nacházet vlákna z hlediska řízení přidělování procesoru?

A

?

155
Q

Jak jsou rozvrhována vlákna řešená uživatelskou knihovnou a co to znamená z hlediska priority vláken?

A

?

156
Q

Jaké modely vícevláknových aplikací znáte?

A
  • boss/worker
  • pipeline
  • peer
  • producer/consumer
157
Q

Co je to Thread Pool a k čemu je dobrý?

A
  • 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
Q

Jak snížíte nároky opakovaného vytváření vláken?

A
  • využitím Thread Pool
159
Q

Jaké vlastnosti sledujeme při návrhu struktury Thread Pool?

A
  • 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
Q

Jakou architekturu vícevláknové aplikace použijete v případě zpracování proudu dat?

A

pipeline

161
Q

Jaké vlastnosti musí splňovat proudové zpracování dat, aby bylo výhodné použít více vláken?

A
  • předpoklady: proud dat, určitá vlákna pracují paralelně na různých částech ‘proudu’ dat
162
Q

Jak předáváme data mezi vlákny v úloze producent/konzument?

A
  • pomocí memory bufferu nebo jen pomocí bufferu referencí (pointerů) na konkrétní datové jednotky
163
Q

Jaké je základní primitivum synchronizace více vláken?

A

pthread_mutex_lock

pthread_mutex_unlock

164
Q

Jaké znáte primitiva pro synchronizaci více vláken?

A

pthread_cond_signal
pthread_cond_wait
pthread_cond_broadcast

165
Q

Kdy říkáme, že je funkce reentrantní?

A
  • 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
Q

Co je to thread-safe funkce?

A
  • jedno či více vláken může vykonat stejnou část kódu bez toho aby způsobily synchronizační problémy
167
Q

Jak dosáhneme reentrantní funkce?

A
  • tak, že tato funkce nebude zapisovat do static data a nepracuje s globálními proměnnými
168
Q

Jak dosáhneme thread-safe funkce?

A
  • 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
Q

Jaké hlavní synchronizační problémy se objevují u vícevláknových aplikací?

A

deadlock

race condition

170
Q

Co je to problém uváznutí (deadlock)?

A
  • když pro dokončení první operace je potřeba dokončit operaci druhou a naopak → zacyklení se, čekají jedna na druhou
171
Q

Co je to problém souběhu (race conditions) u vícevláknové aplikace?

A
  • 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
Q

Jak se lze vyhnout problému uváznutí (“dead-lock”) u vícevláknové aplikace?

A
  • zamykat proměnné vždy ve stejném pořadí (spraví většinu problémů), jinak žádné 100% pravidlo neexistuje