Jak jste na tu změnu došel, resp. jak je potřeba toho vysvětlena?
Edit: tak vysvětlení není nikde na netu napsáno, ale podle mých zjištění je následující:
Třída LiquidCrystal_I2C je potomkem třídy Print. Pokud voláme metodu LiquidCrystal_I2C::print() pro výstup na displej, tak voláme de-facto metodu Print::print(), která v konečném důsledku volá čistě virtuální metodu
Kód: Vybrat vše
virtual size_t Print::write(uint8_t) = 0;
A tato metoda je implementována právě naším potomkem LiquidCrystal_I2C.
Třída Print se dostane k metodě write(uint8_t) při výstupu řetězce takto:
Kód: Vybrat vše
size_t Print::print(const char str[])
{
return write(str);
}
a následně:
Kód: Vybrat vše
size_t write(const char *str) {
if (str == NULL) return 0;
return write((const uint8_t *)str, strlen(str));
}
a konečně:
Kód: Vybrat vše
size_t Print::write(const uint8_t *buffer, size_t size)
{
size_t n = 0;
while (size--) {
if (write(*buffer++)) n++;
else break;
}
return n;
}
Zde používá výše uvedenou metodu write(uint8_t) přetíženou v našem LiquidCrystal_I2C. Je vidět, že pokud se vrátí 0, cyklus tisku řetězce se přeruší pomocí break. Proto je nutné vracet v metodě LiquidCrystal_I2C::write(uint8_t) nenulovou hodnotu.
Mimochodem, tohle dává taky návod, jak napsat vlastní třídu (arduiňácky knihovnu
![Smile :)](./images/smilies/icon_smile.gif)
), která má někam posílat textová data ke zobrazení. Třídu pojmeme jako potomka třídy Print a stačí přetížit její čistě virtuální metodu pro výstup jednoho znaku: write(uint8_t). O řetězcové záležitosti se postarají metody třídy Print. Při výstupu se pak volá metoda print() naší nové třídy (která je ale už implementována v Print).