Вопрос по коду.

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

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вопрос к гуру от программирования. Есть кусок кода -
    Код (C++):
    ...
    char mess_Internal[4];
    char mess_Error[] = "ERR";     // Сообщение об ошибке (то бишь перегрев кристалла)
    word InternalTemp;            // Температура кристалла
    const word ChipTemp = 60;     // Допустимая температура кристалла
    ...
    //====================================================================================
    void loop() {

    InternalTemp = analogRead(ADC_TEMPERATURE); //ADC_TEMPERATURE is #defined to be the channel for reading the temperature; this varies between parts.

    if (InternalTemp < ChipTemp) {
      mess_Internal = InternalTemp;       !!! Здесь показывает ошибку кода !!!
      }
    else {
      mess_Internal = mess_Error;         !!! Здесь тоже покажет ошибку - invalid array assignment !!!

      }
    ...
    ...
    oled.print(mess_Internal);         // Выводим на дисплей температуру кристалла или сообщение о перегреве
    ...
    }
    Не компилируется с сообщением - incompatible types in assignment of 'word {aka unsigned int}' to 'char [4]'
    Как синтаксически правильно написать этот кусок кода ? С уважением.
     
    Последнее редактирование: 1 окт 2022
  2. ИгорьК

    ИгорьК Гуру

    Я, как лет десять не касавшийся Си, все равно не стал бы присваивать указателю на массив значение температуры.
    Здесь с логикой проблемы. Или уже так можно? Там, похожже, звёздочка потерялась.
     
    Последнее редактирование: 1 окт 2022
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Если вводим класс String -
    Код (C++):
    ...
    String mess_Internal;
    String mess_Error = "ERR";     // Сообщение об ошибке (то бишь перегрев кристалла)
    word InternalTemp;            // Температура кристалла
    const word ChipTemp = 60;     // Допустимая температура кристалла
    ...
    //====================================================================================
    void loop() {

    InternalTemp = analogRead(ADC_TEMPERATURE); //ADC_TEMPERATURE is #defined to be the channel for reading the temperature; this varies between parts.

    if (InternalTemp < ChipTemp) {
      mess_Internal = String(InternalTemp);
      }
    else {
      mess_Internal = mess_Error;

      }
    ...
    ...
    oled.print(mess_Internal);         // Выводим на дисплей температуру кристалла или сообщение о перегреве
    ...
    }
    Компилируется успешно, но код распухает на 2К байт и не лезет в кристалл. Проверить работу в реале или симуляторе естественно - невозможно.
    Хотелось бы найти способ по-экономнее.
     
    Последнее редактирование: 1 окт 2022
  4. ИгорьК

    ИгорьК Гуру

    Ну я типа намекаю, что надо пробовать указатели, а не стринг.
     
  5. parovoZZ

    parovoZZ Гуру

    ты хочешь преобразовать числа в символы? Так это делается вовсе не так.

    так нельзя. операнд слева - это указатель на первый элемент массива. Ему нельзя присвоить значение типа word.

    так тоже нельзя.
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну нарисуй как "зя". Тут всего десяток строчек кода. Руки не отвалятся, а я буду премного благодарен. Пойнтеры для меня - темный лес. Сколько пытался - так и не понял.
     
  7. SergeiL

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

    itoa() не?
    char *itoa( int value, char * string, int radix );
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Спасибо уже ближе. Копаю.
     
  9. parovoZZ

    parovoZZ Гуру

    Быстрое преобразование чисел в символы.
    Код (C++):
    #include "stdint.h"



    typedef struct
    {
      uint32_t quot;
      uint8_t rem;
    } divmod10_t;

    inline static divmod10_t divmodu10(uint32_t n)
    {
      divmod10_t res;
     
      res.quot = n >> 1;
      res.quot += res.quot >> 1;
      res.quot += res.quot >> 4;
      res.quot += res.quot >> 8;
      res.quot += res.quot >> 16;

      uint32_t qq = res.quot;
      res.quot >>= 3;
      res.rem = (uint8_t)(n - ((res.quot << 1) + (qq & ~7ul)));

      if (res.rem > 9)
      {
        res.rem -= 10;
        res.quot++;
      }

      return res;
    }

    char* utoa_fast_div(uint32_t value, char* buffer)
    {
      buffer += 11;
     
      *--buffer = 0;
     
      do
      {
        divmod10_t res = divmodu10(value);
       
        *--buffer = res.rem + '0';
       
        value = res.quot;
      }
     
      while (value != 0);
     
      return buffer;
     
    }