Ну что-то в этом есть, конечно. Глюки эта версия обьясняет.
Хотя строка “\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 оказывается частью пользовательского.
==========≠==========
В целом, конечно, все это любопытно, хотя я остаюсь при мнении, что вместо того чтоб решать такие интересные задачки - проще не гадить в константы.
Я помню Петрович блинк замутил, передачей управления в “якобы” непонятную текстовую строку.
Блин… там было легче понять…
Просто быстрая проверка.
Самое точное - это ассемблеровскую портянку просматривать, конечно…
Тогда будет стопроцентное совпадение литералов и это уж точно не будет доказательством.
Еслиб решать, а то мозГ ломамать целый день…
Да, на красный лучше не ходить, чем понять почему, так что ли?
именно так
Но это на этапе компиляции же должно быть? А Петрович сказал, что компилятор тут ни причем.
А если не учили, а я " поперся", кого винить?
Для любопытных - вопрос номер два
Укажите номер сообщения Евгения, про которое он говорит вот тут:
Парни, а не в кодировке тут собака, а?
Так вроде бы русских букв нет, значит не должно…
#9 (номер 9 - поясняю потому, что два символа форум не принимает)
а я ставлю на #12
Э э э, я первый в #86
Первый? Раньше чем автор?