Функция utoa() и её реализация

Тема в разделе "Микроконтроллеры AVR", создана пользователем Faberge, 27 май 2016.

  1. Faberge

    Faberge Administrator Администратор

    Доброе утро.

    Помогите с проблемой, которая, кажется, ставит меня в тупик. К МК подключен дисплей, для дисплея есть библиотека, функции которой работают со строками. Мне надо (для начала) вывести на дисппей показания с аналогового входа. На основе стандартной реализации функции из книги К&R написал следующий код:
    Код (C++):
    uint8_t buffer[12] = "Hello";

    uint32_t num = 356;

    void reverse(uint8_t s[])
    {
        uint8_t i;
        uint8_t j;
        uint8_t c;
       
        for (i = 0, j = 11; i < j; i++, j--)
        {
            c = s[i];
            s[i] = s[j];
            s[j] = c;
        }
    }

    void utoa(uint32_t n, uint8_t s[])
    {
       uint8_t i = 0;
     
       do
       {
           s[i++] = n % 10 + '0';
       }
       while ((n /= 10) > 0);
       s[i] = '\0';
       reverse(s);
    }

    int main()
    {
        led1 = 1;
        lcd.SetFont(&Font12);
        lcd.Clear(LCD_COLOR_BLACK);
        lcd.SetBackColor(LCD_COLOR_BLACK);
        lcd.SetTextColor(LCD_COLOR_GREEN);
        lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"Hello World!!!", CENTER_MODE);
        wait(1);
     
        while(1)a
        {
            if (button1)
            {
              lcd.Clear(LCD_COLOR_BLACK);
              lcd.SetBackColor(LCD_COLOR_BLACK);
              lcd.SetTextColor(LCD_COLOR_GREEN);
              utoa(num, buffer);
              lcd.DisplayStringAt(0, LINE(5), buffer, CENTER_MODE);
            }
            else
            {
              lcd.Clear(LCD_COLOR_BLACK);
            }
           
            led1 = !led1;
            wait(0.2);
        }
    }
    Но почему то не работает функция reverse(). При нажатии на кнопку на дисплее отображается "653", причем если убрать функцию reverse() из функции utoa() то на результат это не влияет. Подскажите советом.
     
  2. AlexU

    AlexU Гуру

    Вариант:
    Код (C++):
    void reverse(uint8_t s[])
    {
        uint8_t i;
        uint8_t j;
        uint8_t c;
     
        for (i = 0, j = strlen(s); i < j; i++, j--)
        {
            c = s[i];
            s[i] = s[j];
            s[j] = c;
        }
    }
    Но лучше вместо "велосипедов" 'utoa' и 'reverse' воспользоваться:
    Код (C++):

            if (button1)
            {
              lcd.Clear(LCD_COLOR_BLACK);
              lcd.SetBackColor(LCD_COLOR_BLACK);
              lcd.SetTextColor(LCD_COLOR_GREEN);
              snprintf(buffer, 12, "%u", num);   // преобразование числа в строку
              lcd.DisplayStringAt(0, LINE(5), buffer, CENTER_MODE);
            }
            else
            {
              lcd.Clear(LCD_COLOR_BLACK);
            }
     
  3. DKo

    DKo Нерд

    МБ функция reverse принимает в качестве аргумента копию строки s[], а на исходную строку не воздействует. Возможно стоит использовать ссылку reverse(uint8_t &s[]). Хотя не буду настаивать, т.к. не разу не видел такой передачи массива в качестве аргумента.
     
  4. aleksis-76

    aleksis-76 Нерд

    попробуйте так void reverse(uint8_t *s)