функция sizeof(Mess) - выдаст размер записи о массиве функция sizeof(Mess[0]) - выдаст размер записи об первом элементе. Вопрос - как узнать длину любого элемента массива ? Его длина во втором байте двух-байтной записи об элементе, но как его прочитать ? Я в синтаксисе этих пойнтеров и звездочек - дуб бесперспективный (((( С уважением к знатокам.
Char - это об одном байте. Любой элемент такого массива будет одинаков в размере. Неправильные книжки читаете. Там логика не так сложна: указатель логически всегда состоит из двух частей (1) адрес памяти, где лежит нечто, (2) стандартного размера.
Думаю, что онн им Думаю, он имел в виду не размер элемента массива, а длину строки. Он, похоже, не чувствует этой разницы и потому не может нормально вопрос задать. Как поэт говорил: "А мы всё ставим каверзный ответ, и не находим нужного вопроса".
Указатели - это некоторое преодоление ардуино подходов. У самодельщика не всегда "щелкает", кто делает код от случая к случаю - не всегда улавливает. ИМХО, это нормально. Да, в книжке все написано, но ее надо уметь читать, и главное - читать часто (если это не твоя работа). Я на С не делаю практически ничего, уже ничего и не помню Только основы. Потому ТС понимаю
Это как это стандартного размера ???? Здесь char* mess[] =... как я понимаю, это массив УКАЗАТЕЛЕЙ на массивы, коими являются строки. Правильно - указатели все (как конверты) одинаковые - двухбайтные (в данном случае). Но строки на которые они указывают - имеют разную длину !!!. Эта длина записана во втором байте указателя. Потому длина строки не должна быть больше 255 знаков. Так вот мне и надо эту длину узнать. Спасибо большое. Это я таки нашел в Нете. И все чудесно работает. Но мне хотелось бы увидеть написанное - как эта команда чтения размера пишется на более низком уровне - с помощью пойнтеров, указателей, звездочек и тп. мне непостижимого.
НЕТ. В указателе лежит АДРЕС и ТОЛЬКО адрес. Больше там нет НИЧЕГО. Причём это касается любого языка программирования.
зачем вычислять, если строки заранее известны? Рядом положи длину строки и всё. А ещё лучше пользоваться не дурино-строками, а массивом стандартных чаров. Тогда и путаницы в голове не будет.
Вы правы. Хрен его знает откуда мне втемяшилось про длину во втором байте, тк понятно что одного первого байта не хватит для адресации 0-32768. Запутался потому, что функция sizeof() дает разные ответы о длине для отдельно-лежащей "строки" и для строки из массива "строк". Для первой - реальную длину, а для второй - адрес "конверта" в котором лежит реальный адрес (Ффух). А все потому, что не попалась мне раньше на глаза эта картинка. Умея "видеть" произвольную область памяти - я и сам бы все понял. С уважением. ПС. Комментарий к 1-й строчке всё разъяснил. ППС. Че-то Филина давно не видно.
Разобрался с длинами. Все прекрасно работает. Но обнаружилась засада. Памяти программ свободно 50%. Динамической свободно - больше 50%. Вроде бы пихай не хочу. Но ! - при дин. памяти меньше 1150 - программа начинает глючить - бегущая строка "начинает начинаться !!!" - не с начала, а со случайного места в середине. Решил "ужимать" тексты переходом на PROGMEM. Одиночные строки жмутся нормально, но массив строк - не хочет. Компилятор ругается. С сообщением variable 'ReklMess' must be const in order to be put into read-only section by means of '__attribute__((progmem))' Как его победить ? С уважением. Спойлер onst char* ReklMess[] PROGMEM = {"Реклама.", "Ремонт электроники, кроме телефонов.", "Разработка схем, плат, программ.", "Тел. 8-xxxxxxxxxx.", "E-mail: xxxxxxxxxx@mail.ru"}; const char* PugMess[] PROGMEM = {"Объект охраняет ИИ.", "Я могу применить электро-шок,", "водомёт и - навозную жижу !!!", "_ Не будите во мне зверя _"}; const char HelloMess[] PROGMEM = "AoL 2025"; const char TimeMess[] PROGMEM = "Время(ч:м:с|д/м/г) - "; const char U_power[] PROGMEM = "Uпит = "; const char T_xtal[] PROGMEM = "Tкрист = "; const char VoltMess[] PROGMEM = " V"; const char CelcMess[] PROGMEM = " C'"; const char TempMess[] PROGMEM = "Температура = ";