Самый простой способ собрать число из символов ('2' + '2' = "22")?

Тема в разделе "Arduino & Shields", создана пользователем mukhin.xyz, 27 мар 2019.

  1. mukhin.xyz

    mukhin.xyz Нерд

    Привет! Лишь несколько недель назад погрузился в мир программирования микроконтроллеров. Первым проектом стала защита на самодельный ТПА станок, которая следит за работой и в случаи если изделие застрянет в прессформе, останавливает цикл станка, чтобы не повредить недешёвую прессформу.

    Ещё недавно считал, что это просто что-то нереальное и этому нужно обучатся долгие годы, а тут раз и идею реализовал.

    В общем я был воодушевлён результатом и для дальнейшего изучения и сравнения выбрал 2 платформы и соответственно 2 платы: Arduino UNO и Iskra JS (Espruino).

    В Arduino привлекает большое сообщество и возможность кодить и прошивать не только в родном IDE (привык к Visual Studio Code). В Espruino язык JS, консоль работающую в реальном времени с платкой.

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

    Есть платы, если матричная клавиатура 4x4. Цель: вводить через матричную клавиатуру числа (включая с точкой), сохранять эти числа в массив. В видео ниже, видно, что с Espruino у меня это получилось, причём довольно легко: https://youtube.com/video/dWHICAEOLeU (видео).

    По нажатию клавиатуры получаем символы '1', '2', '5' и т.д. Собираем в строку '125'. Отправляет строку в массив.

    На JS код дался легко. Так как получаем символы, а не цифры, нам это даже на руку, через += мы их просто соединяем. По готовности числа скидываем в массив и переходим с написанию нового. Это не совсем числа, но их в настоящие перевести не составит труда, используя всего один символ + перед переменной.

    Код (Javascript):
    var x = ""; // переменная для временного хранения числа
    var programs = []; // массив для сохранения чисел


    function pressKey(key) { // выполняем по нажатию цифр, точки. key – символ соответствующий кнопке
       x += key;
    }

    function saveNumber() { // выполняем по готовности числа
       programs.push(x);
       x = ""; // очищает x для построения следующего числа.
    }
    А вот на Arduino я пока не нашёл такого же простого и элегантного способа, я так понимаю из-за чёткого разделения переменных на типы.

    Если бы мне не нужна была запятая, я бы просто сделал

    Код (C++):
    x = x*10 + key-48
    Подскажите пожалуйста лёгкие пути)
     
  2. parovoZZ

    parovoZZ Гуру

    Таки да. Программированию необходимо
     
  3. DIYMan

    DIYMan Гуру

    Нет лёгких путей.

    Ну так делайте, но мыслите шире: как только поймали запятую, то складываем числа в другую переменную. По окончанию ввода - из двух целых чисел получаем число с плавающей точкой, задача более чем тривиальная.
     
    Asper Daffy нравится это.
  4. Daniil

    Daniil Гуру

    Я последнее время плохо понимаю вопросы.
    Вам нужно собрать строку?
    Тогда нужно объявить массив и с каждым нажатием заполнять его
    Код (C++):
    char x[10]; //длину строки с числом нужно знать заранее
    char indx=0;
    ...
    Если нажата цифра то
    {
    x[indx]=код цифры
    indx++;
    }
    если нажата зпт
    {
    x[indx]=код зпт
    indx++;
    }
    если нажат enter
    {
    обработать число, в indx хранится номер последней цифры
    indx=0;//готовность принимать следующее число
    }
    или вам флоат собирать?
    Код (C++):
    float x=0;
    float mul=10;
    ...
    Если нажато число то x=x+число*mul
    Если нажата зпт
    {
    x=x/10 //т.к. в предыдущем ифе мы всегда заранее на 10 домножали, то последнее домножение лишнее.
    mul=0.1;
    }
    если нажат enter
    {
    обработать число
    //подготовка к заполнению следующего числа
    x=0;
    mul=10;
    }
     
    mukhin.xyz нравится это.
  5. Asper Daffy

    Asper Daffy Гуру

    Есть такой волшебный тип данных String, Там можно почти как в JS. В общем, полный сервис для чайников
     
    Daniil, mukhin.xyz и parovoZZ нравится это.
  6. mukhin.xyz

    mukhin.xyz Нерд

    Спасибо, подходит! Делал вчера подобное, но не знал что нужно сразу задавать длину строки.

    Спасибо! C тоже String нужно будет посмотреть
     
    Daniil нравится это.
  7. mukhin.xyz

    mukhin.xyz Нерд

    Со String легко оказалось. Спасибо!

    Код (C++):
    String x = "";

    void inputNumeral(char c) {
      x = String(x + c);
    }
     
    Daniil нравится это.
  8. Андрей Я.

    Андрей Я. Нерд

    int x1, x2, x3, y;
    x1=1;
    x2=2;
    x3=3;

    //y=x1*10^0+x2*10^1+x3*10^2=x1*1+x2*10+x3*100=1*1+2*10+3*100=321
    y=x1*1e0+x2*1e1+x3*1e2; //321