Диапазон символов из char

Тема в разделе "Arduino & Shields", создана пользователем Hatski, 10 июн 2017.

Метки:
  1. Hatski

    Hatski Нуб

    Почему здесь все считают, что я обязан был это учить и знать? )
    Мне не было в этом нужды, а сейчас она появилась. Захотел реализовать один проект. Не светодиодом помигать а немного посложнее. Я забыл упомянуть, это вообще мое первое знакомство с ардуино. Я ее месяц назад в руки взял.
    В общем посчитал, что моих сил хватит. Освоил много интересных и полезных функций с С++. Никого не спрашивая и не доставая вопросами. Просто листая статейки. Но потом, когда код был почти закончен. Мне захотелось усложнить себе жизнь свой код. И я начал добавлять в него какие-то неведомые функции и искать альтернативные варианты реализации уже написанного мной.
    Вот тут я и захотел (ну вот захотел и все!) вместо 3-4 char и byte, использовать одну char и брать из нее куски значения. В принципе, я мог обойтись и без этого (код работает). Но желания знать как это можно сделать меня не покидало.
    А вот как это сделать и без применения циклов я увы не нашел. Думал а вдруг НИЗЯ! Вот и решил спросить.
    У вас на форуме куча вопросов, ТС которые берут чужой код и не понимают что с ним делать. Наверное, чтобы ко мне изначально тут не относились как к тому кто обязан знать основы. Мне нужно было написать заголовок "Как вывести разные буковки из char. Полный нуб!".
    Всем добра =)
     
  2. qwone

    qwone Гик

    Взялся за гуж, не говори что не дюж,
    Назвался груздем, полезай в кузов.
    Взялся за работу программиста- не обижайся за отношения к тебе, как программисту. Да ,все прикинули ,что вы новичок. Поэтому и отношение в вам полегче. Были вы не новичком, то вам пожестще обошлись . Что делать, не мы такие , жизнь такая. И это не только к вам, но и ко мне или кому-то другому, без всякой дискриминации.
    ПС: А тем кто тырит и не понимая чужой код, так там идет вообще стеб, понятный знающим.
     
  3. ИгорьК

    ИгорьК Гуру

    Звиняйте что вмешиваюсь. С появлением ардуино появилась новая категория людей - самодельщики средней степени сообразительности (коей я сам отношусь и ТС тоже). Мы в этом не виноваты - нас ардуино сделала.

    Так вот, как и ТС, мы САМИ разбираемся с основами и никого не достаем. Но, дорогие программисты, вопросы указателей - тема слишком сложная для многих для самообразования.
    Более того, самодельщики не в состоянии "бросить все", упереться и освоить язык на уровне профи. Тогда твое хобби - не самоделки, а сам язык.
    Но хобби у всех разное, не так ли?

    В общем, вряд ли стоит относиться к вопросам типа в этой теме очень строго.

    ТС проделал большую работу и "уперся" в потолок. Пробивать или не пробивать его - он еще не решил, потому что большинство самоделок не требует знания не только указателей, но даже классов.
    Кстати, есть много языков, где указатели в первую очередь изымаются из оборота и присутствующие об этом прекрасно знают.
    Поэтому, пять шт баксов могут быть в них, а могут быть в том же Питоне.

    Повторюсь, ТС не задал вопрос, который все чаще и чаще звучит здесь: "купил ардуино и датчик как построить ракету".
     
    Hatski нравится это.
  4. Unixon

    Unixon Оракул Модератор

    Можно. Для этого вам понадобится сменить язык на Python.
     
  5. Unixon

    Unixon Оракул Модератор

    Это невозможно, char это один байт. То, что вы написали, скорее всего скомпилируется так, что в ваш char запишется младший байт адреса константной строки, т.е. бесполезная величина для манипуляций со строкой.

    Вот объявление char s[] = "mystring"; или char *s = "mystring"; - это уже совсем другое.
     
  6. qwone

    qwone Гик

    Вообще
    Вообще-то и там и там указатель . Вот только с первым нельзя провести адресную арифметику , а с другим можно. Опять же s[1] в обоих случаях даст 'y'. Изымают указатели ради кроссплатформственности программ, по при этом они все равно остаются неявно в языках.
     
  7. Unixon

    Unixon Оракул Модератор

    Вы про какие объявления? Я про неправильное char s = "..."; против правильных char s[] или char *s.
     
  8. Hatski

    Hatski Нуб

    ИгорьК спасибо за поддержку и за такой прекрасный текст, который я сам не смог до них донести)
    Вспоминаю где я Вас видел. Кажется как раз Вашу статью про получение и отправку данных с ардуино на nextion я и читал.

    Чем вас не устроил вариант
    rkit или mcureenab? Вариант rkit меня полностью устроил, лучше я и представить не мог.
    Вы понимаете, у меня есть много функций и условий, где значения очень похожи. Ну к примеру, зачем писать три переменные t, tF и Fx. Когда можно написать один char tFx и брать из него значения (символы в данном случаи) сразу для трех условий. Подобным образом я уже сэкономил несколько сотен! байт оперативки в ардуино.

    Я смотрю, у вас тут пошло уже свое обсуждения, не думал, что мой маленький, простенький вопрос вызовет дискуссию

     
    Последнее редактирование: 12 июн 2017
  9. Unixon

    Unixon Оракул Модератор

    Так, еще раз.
    char - это один байт, из него нельзя брать разные символы, потому, что их там нет.
    char* - это указатель на строку, массив символов, из него можно брать все, что там есть в любых комбинациях.
     
  10. Hatski

    Hatski Нуб

    Да char*
    Извиняюсь, не привык еще. Только сегодня узнал про указатель.
     
  11. mcureenab

    mcureenab Гуру

    Литералы можно развестить памяти программы и брать из них значения функциями с суффиксом _P.

    Тогда оперативной памяти еще больше освободится.

    http://www.nongnu.org/avr-libc/user...space.html#gad92fa2ebe26e65fa424051047d21a0eb
     
  12. Hatski

    Hatski Нуб

    Свободной оперативной памяти не бывает много, а вот оптимизация может быть избыточной.
    Из примеров по ссылке я сразу так не пойму о чем идет речь. Но для общего познания и возможно в будущем пригодится, ссылку сохранил
     
  13. Hatski

    Hatski Нуб

    mcureenab перечитал я как следует ваше сообщение и пример по ссылке. И еще пару статей включая Вики. Попробовал реализовать в новом документу что-то простенькое. Ну как мой пример из первого сообщения.
    Памяти действительно стало требовать немного меньше. Но из минусов для себя увидел, что нужно использовать постороннюю константу, куда идет копирование из основной (я не исключаю, что сделал что-то неправильно).
    Так-же я не понял, как можно прикрутить это к условиям (if, else) или к выводу в порт. Или это допустимо только для функции.
    Я сделал "memcpy(b, t+2, 3); Serial.print(b);". К слову memcpy_P у меня выдавал не читаемые значения.
    Порт использую только лишь для проверки переменных, чтобы знать их значения и быть уверенным в правильности работы.
    Работает, но посторонняя b и необходимость ее обновлять memcpy(b, q+2, 3); не радует
     
  14. mcureenab

    mcureenab Гуру

    Значит не к тому объекту модификатор PROGMEM применили.
     
  15. mcureenab

    mcureenab Гуру

    Так вам и так нужно копировать кусочки строки из константы в буфер для последующих манипуляций.
     
  16. Hatski

    Hatski Нуб

    Возможно, не спорю. По этому и написал, не исключаю, что сделал что-то не правильно. Нужно будет побольше почитать про литералы и PROGMEM
    Да, но сам этот буфер не видно в коде))
    При использовании Serial.write(t, 3); указываем только два значения, начало входа в строку и где остановится. А при memcpy(b, t, 3) три.
    Я понимаю, что и в первом варианте есть некий буфер куда скидывается значение на время. Но мне не пришлось его самому писать в коде в виде константы ))
     
  17. mcureenab

    mcureenab Гуру

    Думаю, без буфера тоже можно. Есть макрос F который оборачивает строку находящуюся в программной памяти в специальный тип, тем самым форсирует выбор экземпляра функции print которая работает с программной памятью, а не с оперативной.

    Вы бы свой пример выложили. Тогда можно будет его разобрать.
     
  18. Hatski

    Hatski Нуб

    Да пример получится весьма примитивный. Библиотека по UART принимает данные и в условиях в loop сверят их. if(message == "LMain ffff ffff ffff").Команда завершается тремя байтами ffff
    Проблема была в том, что (как я выяснил позже) значение в условии, это переменная, которой выделяется место в оперативной памяти. А таких значений очень много.
    Я решил проблему следующим способом
    String Ff = " ffff ffff ffff";
    if(message == "LMain"+Ff).
    А после захотел поиграться, так как у меня в этих самых if дальше есть еще похожие значения типо MainRed, CMain и пр. Возникла идея сделать один char* и в условиях вставлять его указывая диапазон символов (прим. с первой по пятый).
    А сейчас игрался с новым документом, код такой
    Код (C++):
    const char *b = "";
    const char *q = "1234567";

    void loop() {
    memcpy(b, q+2, 3);
      Serial.print(b);
    }
     
  19. mcureenab

    mcureenab Гуру

    Странно что он у вас скомпилировался.
    Первый аргумент функции memcpy это указатель на на lvalue. Кроме того вы в буфер из 0+1 char скопировали три байта. Значит какой то объект поврежден.
     
  20. Hatski

    Hatski Нуб

    Не просто скомпилировался, но и выводит в порт "345"