Displej - zpráva
NSWI170, 2026, Labs 06
Jáchym Bártík
Zpětná vazba k DU
- Hierarchie tříd
- Co na čem závisí?
- Vždy je lepší vyhnout se cyklickým závislostem
- Zodpovědnost
- Která třída zodpovídá za co?
- Třída by měla dělat právě jednu věc
Pointery (ukazatele)
- Ukazují na nějakou adresu v paměti
- Ta se interpretuje jako hodnota daného typu.
- Vytvoření:
- Defaultně - ukazuje na náhodné místo
nullptr - neukazuje nikam (používejte místo NULL)
- Adresa nějaké konkrétní hodnoty (operátor
&)
- Výpočet z jiného pointeru (pointerová aritmetika)
- Alokace - operátor
new, funkce malloc, ...
int* p1; // Pointer to a random place in memory.
int x = 42;
int* p2 = &x; // Pointer to the place where the value 42 is stored.
int y = *p2 + 35; // Pointer dereference - access to the value it points to.
cout << y; // 77
int* p3 = p2 + 1; // Pointer to the next integer after p2.
int* p4 = malloc(7 * sizeof(int)); // Pointer to the first element in an array of seven integers.
Pointerová aritmetika
- Pointer je vlastně jen adresa místa v paměti, neboli číslo
- Z jedné adresy se můžeme snadno posunout na další
- Pozor: pointery nealokují paměť!
int x = 42;
int* p = &x;
*(p + 1) = 13;
| *(p - 1) |
*p |
*(p + 1) |
*(p + 2) |
*(p + 3) |
| ? |
42 |
13 |
? |
? |
- Pointery jsou vlastně jako pole
- Přesněji, pole je pointer na první prvek
- Platí
*(p + i) = p[i] (pro integer i)
- Pokud pracujete s poli, vždy používejte závorky
[]
Na co si dát pozor
- Pointery mohou vést na nedefinované chování
- Přepsání libovolné paměti programu
- Včetně instrukcí (funkční pointery ...)
- Paměť ani nemusí být alokována (
Exception)
- Neinicializované pointery mají náhodnou hodnotu
- Vždy je rovnou inicializujte (nebo použijte
nullptr)!
- Indexování pole mimo rozsah se nikde neověřuje
- Opět hrozí přístup na náhodnou adresu
- Memory leaky
- Při ruční alokaci paměti je nutné ji zase dealokovat
- Pointer není reference
String
- V C++ existuje třída String
- V C je to složitější - musíme použít
const char*
- Pole konstantních znaků
- Je ukončeno znakem
'\0' (null)
const char* string = "Hello world";
int foo(const char* s) {
int i = 0;
while (s[i])
i++;
return i;
}
foo(string); // What is the output of this function?
Cvičení #1
- Zobrazte na displeji krátkou zprávu
- Upravte třídu pro displej tak, aby jí bylo možné předat zprávu (
const char*)
- Z ní vypište první čtyři znaky
- Použijte multiplexing (jako minule)
- Mapa znaků je v recodexu u domácího úkolu #6
- Znaky mimo zprávu považujte za prázdné
- Bonus: Tlačítka posouvají zprávu doleva a doprava
Cvičení #2
- Zobrazte na displeji běžící zprávu
- Každých 300 ms posuňte zobrazované znaky o jedna
- Struktura:
- Třída
A - zapisuje na displej pomocí multiplexingu
- Třída
B - řeší rotování zprávy (říká A co má vypsat)
- Funkce
loop - komunikuje pouze s B
- Příklad -
Hello:
___H |
Hell |
lo__ |
__He |
ello |
o___ |
_Hel |
llo_ |
____ |
Domácí úkol #6
- Vytvořte displej zobrazující běžící zprávu
- Vyjděte ze cvičení #2
- Zpráva se předává sériovým portem
- Vždy se zobrazí celá
- Jakmile skončí, zjistíte, jestli existuje nová (pokud ne, zobrazíte znovu starou)
- Komunikaci řeší knihovna (ke stažení na recodexu)
- Používejte pointery a C stringy (
const char*), ne pokročilé C++ konstrukce