Говнокод по пятницам. Эпизод 3. «Serial.println vs. Imperial Starfleet»

Ну что-то в этом есть, конечно. Глюки эта версия обьясняет.
Хотя строка “\r\n” точно есть в исходнике класса Сериал, а вроде он компилируется раньше скетча. Так что вариант, что эта строка берется из пользовательского литерала, представляется сомнительным.

Не тупи, пользовательский литерал таковым не является.
Он нужен и объявляется в данном случае только для того, что бы компилятор линканул адрес литерала класса.
А вот потом через “указатель на указатель” можно сделать ему (или скорее себе) больно.

При объявлении
char *message=“\r\n”, создаётся только указатель на адрес этого литерала, который до этого был прописан в классе Print.h

Где ты увидел такое объявление в коде?
У нас вместо этого
char *message=“blablabla\r\n”.

Если к моменту объявления более длинного литерала более короткий уже определен - то как они линкуются один к другому? ( наоборот понятно)

Хотя что спорить, в целом думаю ты прав. Мне только некоторые мелочи не вполне понятны.

class Print
{
  private:
    int write_error;
    size_t printNumber(unsigned long, uint8_t);
    size_t printFloat(double, uint8_t);
  protected:
    void setWriteError(int err = 1) { write_error = err; }
  public:
    Print() : write_error(0) {}
  
    int getWriteError() { return write_error; }
    void clearWriteError() { setWriteError(0); }
  
    virtual size_t write(uint8_t) = 0;
    size_t write(const char *str) {
      if (str == NULL) return 0;
      return write((const uint8_t *)str,strlen(str));
    }
    virtual size_t write(const uint8_t *buffer, size_t size);
    size_t write(const char *buffer, size_t size) {
      return write((const uint8_t *)buffer, size);
    }

18 строка??

Думаю, что надо создать в .ino литерал “\r\n”, посмотреть его адрес и сравнить с адресом более длинного литерала, который тоже содержит “\r\n”.
Если они близко, то Кактус прав и Death Star подрывается через закидывание тротиловой шашки в канализацию.

size_t Print::println(void)
{
  return write("\r\n");
}

Петрович!!
Дай поспать спокойно, хоть одну пятницу)))

Не доказательство.
Проще и эффективнее создать “\r\n” и потом переписать по этому адресу чем-то другим.
Хотя Евгений ровно это и проделал.

Скорее всего, литералы тоже подвергаются оптимизации, так и получается, что “системный” литерал из класса Print оказывается частью пользовательского.

==========≠==========
В целом, конечно, все это любопытно, хотя я остаюсь при мнении, что вместо того чтоб решать такие интересные задачки - проще не гадить в константы.

Я помню Петрович блинк замутил, передачей управления в “якобы” непонятную текстовую строку.
Блин… там было легче понять…

Просто быстрая проверка.
Самое точное - это ассемблеровскую портянку просматривать, конечно…

Тогда будет стопроцентное совпадение литералов и это уж точно не будет доказательством.

Еслиб решать, а то мозГ ломамать целый день…
Да, на красный лучше не ходить, чем понять почему, так что ли?

1 лайк

именно так

Но это на этапе компиляции же должно быть? А Петрович сказал, что компилятор тут ни причем.

А если не учили, а я " поперся", кого винить?

Для любопытных - вопрос номер два :slight_smile:

Укажите номер сообщения Евгения, про которое он говорит вот тут:

1 лайк

Парни, а не в кодировке тут собака, а?

Так вроде бы русских букв нет, значит не должно…

#9 (номер 9 - поясняю потому, что два символа форум не принимает)

а я ставлю на #12

1 лайк

Э э э, я первый в #86 :smile:

Первый? Раньше чем автор?