Что это такое?

Сантеха! )))

Ну… возможно это его специфика… Жить то как то нужно… Нормально.)

По крайней мере, таких явных ляпов как раньше, не заметил.
Но, как там говорится… “и хоть ложечки мы нашли, но неприятный осадок остался”))

Ого, вот это да… Спасибо. Значит моя функция не самое слабое звено, Ок)))
Я байтики считаю, а кто-то вообще не парится…

Я тут подумал, наверное не настолько важна) Но будет время, попробую почитать ту огромную ветку, может чего и пойму. Еще раз спасибо.

Да нормальный он чел. Уж точно получше меня в деле, и уверен получше некоторых тут на форуме… С учетом того, что он также “не программер” как и я))
Даже стоит того, что его обсуждают в темах, хотя речь не о нем :wink:

Особенно умиляет его разбивка на несколько .ino.) Или это:

Как настроить время на часах. У нас есть возможность автоматически установить время на время загрузки прошивки, поэтому:

  • Ставим настройку RESET_CLOCK на 1
  • Прошиваемся
  • Сразу ставим RESET_CLOCK 0
  • И прошиваемся ещё раз
  • Всё
    Куча фишек, графики давления и т.п., а установка часов прямо в скетче.
    Ну вот убежали у меня часы и чо? По инструкции? Ужас.(

Сделал так, изменил остальной код в проекте под новую LCDPrint
и у меня кончилось место в ардуине.
Изменил на:
void LCDPrint(byte x, byte y, const char * txt,
byte ln = 0, TAlign alg = alL, char ch = ’ ') {
т.е. убрал везде const и &, и память освободилась… Думал в этом случае проиграл в скорости, но сделал тест из 100 одинаковых вызовов с конст и без, так и в скорости не проиграл, даже на удивление чуть быстрее работает… Что-то я запутался))

Проект с такой:

void LCDPrint(byte x, byte y, const char *txt,
              byte ln = 0, TAlign alg = alL, char ch = ' ') {

Скетч использует 25478 байт (82%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1556 байт (75%) динамической памяти, оставляя 492 байт для локальных переменных. Максимум: 2048 байт.

с этой:

 void LCDPrint(const byte &x, const byte &y, const char * txt,
               byte ln = 0, const TAlign &alg = alL, const char &ch = ' ') {

Скетч использует 30760 байт (100%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1556 байт (75%) динамической памяти, оставляя 492 байт для локальных переменных. Максимум: 2048 байт.
Скетч слишком большой; прочитайте https://support.arduino.cc/hc/en-us/articles/360013825179
text section exceeds available space in board

Compilation error: text section exceeds available space in board

Это тесты на скорость

Спойлер
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
enum TAlign {alL, alC, alR};

 void LCDPrint(const byte &x, const byte &y, const char * txt,    //Так много места заниамет
               byte ln = 0, const TAlign &alg = alL, const char &ch = ' ') {
  if (x > 19 || y > 3) return;
  byte tln = strlen(txt);
  if (!ln) ln = tln;
  if (x + ln > 20) ln = 20 - x;
  char str[ln + 1];

  if (ln == tln) strcpy(str, txt);
  else {
    if (alg == alL) {
      if (tln > ln) {
        strncpy(str, txt, ln);
      }
      if (ln > tln) {
        strcpy(str, txt);
        for (byte n = tln; n < ln; n++) str[n] = ch;
      }
    }
    if (alg == alC) {
      if (tln > ln) {
        strncpy(str, txt + (tln / 2 - ln / 2), ln);
      }
      if (ln > tln) {
        for (byte n = 0; n < ln; n++) str[n] = ch;
        strncpy(str + (ln / 2 - tln / 2), txt, tln);
      }
    }
    if (alg == alR) {
      if (tln > ln) {
        strncpy(str, txt + tln - ln, ln);
      }
      if (ln > tln) {
        for (byte n = 0; n < ln - tln; n++) str[n] = ch;
        strcpy(str + ln - tln, txt);
      }
    }
  }
  lcd.setCursor(x, y);
  str[ln] = 0;
  lcd.print(str);
}

void setup() {
  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  long ms = millis();
  for (byte n = 0; n < 100; n++) {
    LCDPrint(7, 0, "12345678901234567890111");
    LCDPrint(10, 1, "77", 7, alR, '0');
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(0, 3, "11", 20, alC, '=');
  }
  Serial.println(millis() - ms);
}

void loop() {
}
Спойлер
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
enum TAlign {alL, alC, alR};

void LCDPrint(byte x, byte y, const char * txt,
              byte ln = 0, TAlign alg = alL, char ch = ' ') {
  if (x > 19 || y > 3) return;
  byte tln = strlen(txt);
  if (!ln) ln = tln;
  if (x + ln > 20) ln = 20 - x;
  char str[ln + 1];

  if (ln == tln) strcpy(str, txt);
  else {
    if (alg == alL) {
      if (tln > ln) {
        strncpy(str, txt, ln);
      }
      if (ln > tln) {
        strcpy(str, txt);
        for (byte n = tln; n < ln; n++) str[n] = ch;
      }
    }
    if (alg == alC) {
      if (tln > ln) {
        strncpy(str, txt + (tln / 2 - ln / 2), ln);
      }
      if (ln > tln) {
        for (byte n = 0; n < ln; n++) str[n] = ch;
        strncpy(str + (ln / 2 - tln / 2), txt, tln);
      }
    }
    if (alg == alR) {
      if (tln > ln) {
        strncpy(str, txt + tln - ln, ln);
      }
      if (ln > tln) {
        for (byte n = 0; n < ln - tln; n++) str[n] = ch;
        strcpy(str + ln - tln, txt);
      }
    }
  }
  lcd.setCursor(x, y);
  str[ln] = 0;
  lcd.print(str);
}

void setup() {
  lcd.init();
  lcd.backlight();
  Serial.begin(115200);
  long ms = millis();
  for (byte n = 0; n < 100; n++) {
    LCDPrint(7, 0, "12345678901234567890111");
    LCDPrint(10, 1, "77", 7, alR, '0');
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(3, 2, "HRtyX12345TestLongStringUp20", 6, alC);
    LCDPrint(0, 3, "11", 20, alC, '=');
  }
  Serial.println(millis() - ms);
}

void loop() {
}

кто посоветовал/заставил написать так?

Сам. Наверное что-то из далекого прошлого из делфи повлияло на это…
Я так понял дело не в конст а в ссылках(&)… Из-за них размер кода вырос…

понятно.
просто дня три назад, тут на форуме, увидел точь в точь передачу параметров, вот и подумалось.
сам то я в этом почти ничего не понимаю… :smiling_face:

1 лайк

Я думал что передав параметр по ссылке увеличится скорость работы (про размер кода вообще не думал) ибо не будут лишних копирований переменных( в параметры)…

В общем вернул конст но убрал ссылки. Конст хоть и не критично, но все-таки дает наглядность коду…

А вот с ссылками подстава))) Наверное для больших объектов, те которые размером больше самих ссылок - там может и есть от них плюс… а тут и размер кода скорее всего вырос из-за передаю параметр байтовый но по ссылке, а ссылка 2 байта? …же

Ладно, работает и да ладно))) (шутка, никогда так не делайте)

Можно ссылку? Посмотреть хочется… Что-то мне нет попалась эта тема

это которые x,y,alg и ch? :grinning: трудно что то в них больше байта представить.

то есть это работаь не будет?

  for (byte n = 0; n < 10; n++) {
    LCDPrint(n, 0, "*");
  }

можно

Нет. Это я не про свои параметры говорил. А вообще - если у вас в функцию передается какой-либо большой объект (например структура) и ее не нужно в функции изменять, то для нее есть смысл передать ее по ссылке (&) и const - но это не точно ))) Я не учился этому(

Почему же… будет.
Конст не для наружи, конст для параметра. Т.е. этот параметр в функции изменять нельзя. А туда (фактические/формальные - я их путаю) передавай хоть переменную, хоть литерал, хоть константу…

Спасибо

Вот чисто ради интереса

MCP4xxxx(const int& CS, const int& MOSI, const int& SCK, const uint32_t& maxSpeedWrite, const uint8_t& SPIMode);

Зачем пины передаются по ссылкам?

Вот скорее всего этот вопрос и связан с размером ссылки и с размером передаваемого параметром пина. размеры одинаковые скорее всего. Там ответа на этот вопрос я не нашел, так-то это мои предположения.

а парень не так прост, как могло показаться с первого взгляда)

Это был намек, что так делать не нужно ))

Это я понял… что намек… что так нельзя, а причина? Почему так нельзя? Это не связано с размером ссылки и размером параметра?

Потому что бессмысленно. По ссылке передаются переменные, которые должны быть изменены в функции, а номера пинов, т.е. константы, там нафиг не нужны по ссылке.

Т.е. сделать так можно, но зачем? ))

2 лайка