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

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

  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
  8. ИгорьК

    ИгорьК Гуру

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

    DetSimen Гуру

    а вот те хрен. в си строка нигде свою длину не хранит, обломайся. только вычислять.
     
    Ariadna-on-Line нравится это.
  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
  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
  17. AlexU

    AlexU Гуру

    В компиляторе gcc, который Вы скорее всего используете, не средств для указания того, что элементы массива также должны быть размещены во флеш-памяти.
    Поэтому:
    Код (C++):
    // сначала создаём строки во флеш
    const char ReklMess_0[] PROGMEM = "Реклама.";
    const char ReklMess_1[] PROGMEM = "Ремонт электроники, кроме телефонов.";
    const char ReklMess_2[] PROGMEM = "Разработка схем, плат, программ.";
    const char ReklMess_3[] PROGMEM = "Тел. 8-xxxxxxxxxx.";
    const char ReklMess_4[] PROGMEM = "E-mail: xxxxxxxxxx@mail.ru.";

    // потом создаём массив указателей на эти строки
    // массив указателей также будет во флеш
    const char * const ReklMess[] PROGMEM = { ReklMess_0,
      ReklMess_1,
      ReklMess_2,
      ReklMess_3,
      ReklMess_4 };
    Но с такими данными нужно будет правильно обращаться, т.к. они находятся во флеш-памяти, а не в RAM.
    И обратите внимание на два const в последней декларации. Первый const говорит, что элементы массива это константы, а второй, что сам массив константа.
     
    Ariadna-on-Line нравится это.
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    То же самое прочитал и успел разочароваться, тк нужны строки именно как в спойлере (чтобы женщина средней тупости могла их менять без напряга)))))). Ради любопытства нарисовал именно -
    const char * const ReklMess[] PROGMEM = {"Реклама.", ...};
    Компилятор проглотил и не чихнул. Ужалось на четверть ! Теперь надо суметь их читать. Спасибо.
     

    Вложения:

    Последнее редактирование: 24 мар 2025
  19. AlexU

    AlexU Гуру

    При таком подходе строки, которые элементы массива, всё равно будут занимать оперативную память. Сам массив с указателями будет во флеш, а строки в RAM.
    Это можно сделать через #define. Но навскидку не готов показать пример. Надо дома искать среди своих старых проектов.
     
    Ariadna-on-Line нравится это.
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вы правы. ужалось вообще до 364 байт. Но это без операций чтения. Спасибо большущее. Если надо будет разработать печатную плату или электронную схему - рад буду помочь. С уважением..