Arduino

displej - zpráva

NSWI170, 2025, 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 na náhodné místo v paměti.

int x = 42;
int* p2 = &x;       // Pointer na místo, kde je uložena hodnota 42.
int y = *p2 + 35;   // Dereference pointeru - přístup k hodnotě, na kterou ukazuje.
cout << y;          // 77

int* p3 = p2 + 1;  // Pointer na následující integer za p2.
int* p4 = malloc(7 * sizeof(int));  // Pointer na první prvek v poli sedmi integerů.

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";
H e l l o
W o r l d \0
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