Char* mess[] = {"...", "...", ...};

Тема в разделе "Микроконтроллеры AVR", создана пользователем Ariadna-on-Line, 19 мар 2025 в 16:18.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    функция sizeof(Mess) - выдаст размер записи о массиве
    функция sizeof(Mess[0]) - выдаст размер записи об первом элементе.

    Вопрос - как узнать длину любого элемента массива ? Его длина во втором байте двух-байтной записи об элементе, но как его прочитать ? Я в синтаксисе этих пойнтеров и звездочек - дуб бесперспективный ((((
    С уважением к знатокам.
     
  2. ИгорьК

    ИгорьК Гуру

    Char - это об одном байте. Любой элемент такого массива будет одинаков в размере.

    Неправильные книжки читаете. Там логика не так сложна: указатель логически всегда состоит из двух частей (1) адрес памяти, где лежит нечто, (2) стандартного размера.
     
  3. DetSimen

    DetSimen Гуру

    size_t size = strlen(mess[NElem]);
     
    Ariadna-on-Line и Asper Daffy нравится это.
  4. Asper Daffy

    Asper Daffy Иксперд

    Думаю, что онн им
    Думаю, он имел в виду не размер элемента массива, а длину строки. Он, похоже, не чувствует этой разницы и потому не может нормально вопрос задать.

    Как поэт говорил: "А мы всё ставим каверзный ответ, и не находим нужного вопроса".
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Троллишь :D
     
  6. ИгорьК

    ИгорьК Гуру

    Указатели - это некоторое преодоление ардуино подходов. У самодельщика не всегда "щелкает", кто делает код от случая к случаю - не всегда улавливает. ИМХО, это нормально.

    Да, в книжке все написано, но ее надо уметь читать, и главное - читать часто (если это не твоя работа). Я на С не делаю практически ничего, уже ничего и не помню :) Только основы.

    Потому ТС понимаю :)
     
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Это как это стандартного размера ???? Здесь char* mess[] =... как я понимаю, это массив УКАЗАТЕЛЕЙ на массивы, коими являются строки. Правильно - указатели все (как конверты) одинаковые - двухбайтные (в данном случае). Но строки на которые они указывают - имеют разную длину !!!. Эта длина записана во втором байте указателя. Потому длина строки не должна быть больше 255 знаков. Так вот мне и надо эту длину узнать.
    Спасибо большое. Это я таки нашел в Нете. И все чудесно работает. Но мне хотелось бы увидеть написанное - как эта команда чтения размера пишется на более низком уровне - с помощью пойнтеров, указателей, звездочек и тп. мне непостижимого.
     
    Последнее редактирование: 20 мар 2025 в 16:32
  8. ИгорьК

    ИгорьК Гуру

    Перспектива все таки есть :)
     
  9. DetSimen

    DetSimen Гуру

    а вот те хрен. в си строка нигде свою длину не хранит, обломайся. только вычислять.
     
  10. Asper Daffy

    Asper Daffy Иксперд

    Возможно, в его структуре данных так реализовано, что хранит. Никто ж не мешает.
     
  11. parovoZZ

    parovoZZ Гуру

    НЕТ. В указателе лежит АДРЕС и ТОЛЬКО адрес. Больше там нет НИЧЕГО. Причём это касается любого языка программирования.
     
  12. parovoZZ

    parovoZZ Гуру

    зачем вычислять, если строки заранее известны? Рядом положи длину строки и всё. А ещё лучше пользоваться не дурино-строками, а массивом стандартных чаров. Тогда и путаницы в голове не будет.
     
  13. Asper Daffy

    Asper Daffy Иксперд

    А ТС чем по-Вашему пользуется?

     
    DetSimen нравится это.
  14. DetSimen

    DetSimen Гуру

    Железноголовый - не читатель.
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вы правы. Хрен его знает откуда мне втемяшилось про длину во втором байте, тк понятно что одного первого байта не хватит для адресации 0-32768. Запутался потому, что функция sizeof() дает разные ответы о длине для отдельно-лежащей "строки" и для строки из массива "строк". Для первой - реальную длину, а для второй - адрес "конверта" в котором лежит реальный адрес (Ффух). А все потому, что не попалась мне раньше на глаза эта картинка. Умея "видеть" произвольную область памяти - я и сам бы все понял. С уважением.
    ПС. Комментарий к 1-й строчке всё разъяснил.
    ППС. Че-то Филина давно не видно.
     

    Вложения:

    Последнее редактирование: 21 мар 2025 в 19:04
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Разобрался с длинами. Все прекрасно работает. Но обнаружилась засада. Памяти программ свободно 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 = "Температура = ";
     
    Последнее редактирование: 24 мар 2025 в 01:03