Professional Documents
Culture Documents
vod do C, 3.3.2014
PB071
Organizan
vod do C, 3.3.2014
PB071
Organizan
Prce na Unixovch strojch
Poadujeme jen elementrn zklady (ssh, gcc) http://www.ee.surrey.ac.uk/Teaching/Unix/
C vs. Python
Pipravili jsme pro vs pehled zkladnch rozdl (dky M. Klurovi) http://cecko.eu/public/cvspython
vod do C, 3.3.2014
PB071
Vnitrosemestrln test
Termn 7.4. v 12:00 a 13:00 v D1 Nutno se pihlsit pes IS (bude oteveno pozdji) Formou paprovho odpovdnku Celkov zisk max. 20 bod
vod do C, 3.3.2014
PB071
vod do C, 3.3.2014
PB071
Funkce - koncept
Dleit prvek jazyka umoujc zachytit rozdlen eenho problmu na podproblmy Logicky samostatn st programu (podprogram), kter zpracuje svj vstup a vrt vstup
vstup v nvratov hodnot nebo pomoc vedlejch efekt
zmna argument nebo globlnch promnnch
int main(void) { // ... float f2c(float fahr) { for (int fahr = low; fahr <= high; fahr += step) { return F2C_RATIO * (fahr - 32); celsius = 5.0 / 9.0 * (fahr 32); } } int main(void) { return 0; } // ...
implementace funkce
vod do C, 3.3.2014
for (int fahr = low; fahr <= high; fahr += step) { float celsius = f2c(fahr); PB071 voln funkce // ...
Funkce - deklarace
Znme ji funkci main
int main() { return 0; }
void foo1(void); int foo2(void); pedbn deklarace float foo3(int a); deklarace a definice zrove float foo3(int); void foo4(int a, float* b); Deklarace funkce
nvratov_typ jmno_funkce(arg1, arg2, arg3...); lze i bez uveden jmen promnnch (pro prototyp nejsou dleit)
vod do C, 3.3.2014
PB071
Funkce - definice
Implementace tla funkce (kd) Uzaveno v bloku pomoc {}
pozor, lokln promnn zanikaj
PB071
Funkce - argumenty
Funkce me mt vstupn argumenty
dn, fixn poet, promnn poet lokln promnn v tle funkce maj piazen datov typ (typov kontrola)
implementace funkce, fahr je lokln promnn voln funkce s argumentem 100, 100 je vraz
PB071
vod do C, 3.3.2014
PB071
vyuit globlnch promnnch (vtinou nevhodn) strukturovan typ na vstup (struct, ukazatel) modifikac vstupnch parametr (pedn ukazatelem)
int div = 0; int rem = 0; void divRem(int a, int b) { div = a / b; rem = a % b; } int main() { divRem(7, 3); return 0; } PB071
vod do C, 3.3.2014
vod do C, 3.3.2014
PB071
Pamt
Pam obsahuje velk mnostv slot s fixn dlkou
short
int
nap. promnn typu short zabr na x86 16 bit (2 bajty) adresa entity v pamti je dna prvnm slotem, kde je entita umstna
0xff
0xff
0xff 0x2b 0x00 0x00
vod do C, 3.3.2014
PB071
Organizace pamti
Instrukce (program)
nemn se
push %ebp 0x00401345 mov %esp,%ebp 0x00401347 sub $0x10,%esp 0x0040134d call 0x415780
Zsobnk (stack)
mn se pro kadou funkci (stackframe) lokln promnn
Zsobnk
lokalniProm1 lokalniProm2
Halda (heap)
mn se pi kadm malloc, free dynamicky alokovan prom.
Halda
dynAlokace1 dynAlokace2
vod do C, 3.3.2014
PB071
Promnn opakovn
Kad msto v pamti m svou adresu Pomoc nzvu promnn meme st nebo zapisovat do tto pamti instrukce assembleru pro
nap. promenna = -213;
zpis do pamti
vod do C, 3.3.2014
PB071
Promnn na zsobnku
POZOR: Zsobnk je zde znzornn uebnicovm zpsobem (rst nahoru) C kd: int promennaX = -213; Asembler kd: movl
esp + 0xc 0x00000000 esp + 0x8 0x00000000 esp + 0x4 0x00000000 relativn dno zsobnku (esp) pro aktuln funkci
vod do C, 3.3.2014
$0xffffff2b,0xc(%esp)
0xffffff2b promennaX
4 bajty
PB071
Opertor &
Opertor & vrac adresu svho argumentu
msto v pamti, kde je argument uloen
int promennaX = -213; (promennaX je adresa schrnky 1, obsahuje -213) int* pX = &promennaX; (pX je adresa schrnky 2, obsahuje adresu schrnky 1)
-213
vod do C, 3.3.2014
PB071
Pozor na int* a, b;
a je int*, b jen int
-213
Y X
PB071
ukazatel
vod do C, 3.3.2014
vod do C, 3.3.2014
PB071
Opertor dereference *
Pracuje nad promnnmi typu ukazatel
podvej se na adresu v promnn X jako na hodnotu typu Y
Pokud je dereference pouita jako l-hodnota, tak se mn odkazovan hodnota, nikoli adresa ukazatele
int* pX; pX = 10; (typicky patn nechceme mnit ukazatel) int* pX; *pX = 10; (typicky OK chceme mnit hodnotu, kter je na adrese na kterou pX ukazuje)
vod do C, 3.3.2014
PB071
int promennaX = -213; (promennaX je adresa schrnky 1, obsahuje -213) int* pX = &promennaX; (pX je adresa schrnky 2, obsahuje adresu schrnky 1) int** ppX = &pX; (ppX je adresa schrnky 3, obsahuje adresu schrnky 2, kter obsahuje adresu schrnky 1)
-213
print(*pX); vype? (-213) (-213) print(*ppX); vype? 1 print(promennaX); vype? print(pX); vype? 1 print(&pX); vype? 2 print(ppX); vype? 2 print(*(&pX)); vype? 1
vod do C, 3.3.2014
PB071
Segmentation fault
Promnn typu ukazatel obsahuje adresu
int promennaX = -213; int* pX = &promennaX;
vod do C, 3.3.2014
PB071
PB071
ast problm
V em je problm s nsledujcm kdem?
int* a, b; a[0] = 1; b[0] = 1;
Specifikace ukazatele * se vztahuje jen k prvn promnn (a) ne ji ke druh (b) Radji deklarujte a i b na samostatnm dku a inicializujte
vod do C, 3.3.2014
PB071
Samostudium
Detailnj rozbor zsobnku a haldy
http://duartes.org/gustavo/blog/post/anatomy-of-aprogram-in-memory http://www.inf.udec.cl/~leo/teoX.pdf
vod do C, 3.3.2014
PB071
// x is 3
return 0; }
Po zniku lokln promnn se zmna nepropaguje mimo tlo funkce eenm je pedvat adresu promnn
a modifikovat hodnotu na tto adrese, namsto lokln promnn
vod do C, 3.3.2014
PB071
vod do C, 3.3.2014
int x = 0; (x je adresa schrnky 1, obsahuje hodnotu 0) void foo(int* P); (P je adresa schrnky 2, kam se ulo argument funkce foo() foo(&x); (&x vrt adresu schrnky 1, ta se ulo do lokln promnn P) *P = 3; (*P vrt obsah schrnky 2, tedy adresu 1)
vod do C, 3.3.2014
----------------1 ----------------3 1 2
PB071
Zsobnk myValue1
1
myValue2
1 7
value
1 5
pValue
&myValue2
PB071
Jednorozmrn pole
vod do C, 3.3.2014
PB071
Jednorozmrn pole
Jednorozmrn pole lze implementovat pomoc ukazatele na souvislou oblast v pamti
jednotliv prvky pole jsou v pamti za sebou prvn prvek umstn na pamov pozici uchovvan ukazatelem
0x00
0x00
0x2b
0x00
0xff
0xff
0xff
0x2b
0x00
0x00
PB071
vod do C, 3.3.2014
myArray[9] (hodnota)
vod do C, 3.3.2014
10
11
12
13
14
15
16
17
18
19
myArray[10] (problem)
myArray[0] (hodnota)
myArray (adresa)
PB071
sizeof(ukazatel)
velikost ukazatele (typicky 4 nebo 8 bajt)
vod do C, 3.3.2014
PB071
vod do C, 3.3.2014
PB071
printf("tmp=%p, %d\n", array+1); // address of second element printf("tmp=%p, %d\n", &array+1);// == array + sizeof(char) * 10 return 0; }
Jmno pole array se obvykle vyhodnot na adresu prvnho prvku pole (zvis na pekladae)
&array == array Ale array+1 != &array+1 (pokud je pole del jak jeden element)
http://stackoverflow.com/questions/2528318/c-how-come-an-arrays-addressis-equal-to-its-value
vod do C, 3.3.2014
PB071
Prce s poli
vod do C, 3.3.2014
PB071
Jednotliv prvky pole jsou v pamti za sebou Promnn typu pole obsahuje adresu prvnho prvku pole
int *pArray = array; int *pArray = &array[0];
Indexuje se od 0
n-t prvek je na pozici [n-1]
PB071
vod do C, 3.3.2014
Ukazatelov aritmetika
Aritmetick opertory provdn nad ukazateli Vyuv se faktu, e array[X] je definovno jako *(array + X) Opertor + pit k adrese na rovni prvk pole
nikoli na rovni bajt! obdobn pro -, *, /, ++ ...
vod do C, 3.3.2014
PB071
*(myArray+2) (hodnota)
myArray[0] (hodnota)
myArray+2 (adresa)
myArray (adresa)
10
11
12
13
14
pArray (adresa)
15
16
myArray[6] (hodnota) 17
18
19
vod do C, 3.3.2014
PB071
void demoPointerArithmetic() { const int arrayLen = 10; int myArray[arrayLen]; int* pArray = myArray; // value from variable myArray is assigned to variable pArra int* pArray2 = &myArray; // wrong, address of variable array, //not value of variable myArray (warning) for (int i = 0; i < arrayLen; i++) myArray[i] = i; myArray[0] = 5; // OK, first item in myArray *(myArray + 0) = 6; // OK, first item in myArray //myArray = 10; // wrong, we are modifying address itself, not value on address pArray = myArray + 3; // pointer to 4th item in myArray //pArray = 5; // wrong, we are modifying address itself, not value on address *pArray = 5; // OK, 4th item pArray[0] = 5; // OK, 4th item *(myArray + 3) = 5; // OK, 4th item pArray[3] = 5; // OK, 7th item of myArray pArray++; // pointer to 5th item in myArray pArray++; // pointer to 6th item in myArray pArray--; // pointer to 5th item in myArray
int numItems = pArray - myArray; // should be 4 (myArray + 4 == pArray) } PB071 vod do C, 3.3.2014
Co vrt myArray[10]? Co vrt myArray[3]? Co vrt myArray + 3? Co vrt *(pArray 2) ? Co vrt pArray - myArray ?
vod do C, 3.3.2014
PB071
ten/zpis mimo alokovanou pam me zpsobit pd nebo nedouc zmnu jinch dat (kter se zde nachz)
int array[10]; array[100] = 1; // runtime exception
vod do C, 3.3.2014
PB071
Tutoril v etin
Programovn v jazyku C
http://www.sallyx.org/sally/c/
vod do C, 3.3.2014
PB071
Shrnut
Platnost promnnch
promnn zanik na konci bloku kde byla deklarovna vjimkou jsou globln promnn
Pole
vod do C, 3.3.2014
PB071