вывод десятичного printf с фиксированной запятой

#c #embedded #fixed #point

#c #встроенный #исправлено #точка

Вопрос:

На моем TM4C123 работает мой ЖК-дисплей, и у меня работает printf.

Я пытаюсь сделать так, чтобы входные данные из левого столбца выглядели как выходные данные из правого столбца.

Я пытался извлечь каждую цифру из целого числа, а затем распечатать каждую из них, а затем поместить десятичную дробь где-нибудь там. Когда я извлекаю цифры, знак, похоже, совпадает с цифрой, и я просто не могу правильно отформатировать его.

 outTestCaseType1 outTests1[13]={ 
{     0,  " =  0.000?r" }, //     0/1000 = 0.000  
{     4,  " =  0.004?r" }, //     4/1000 = 0.004  
{    -5,  " = -0.005?r" }, //    -5/1000 = -0.005
{    78,  " =  0.078?r" }, //    78/1000 = 0.078
{  -254,  " = -0.254?r" }, //  -254/1000 = -0.254
{   999,  " =  0.999?r" }, //   999/1000 = 0.999
{ -1000,  " = -1.000?r" }, // -1000/1000 = -1.000
{  1234,  " =  1.234?r" }, //  1234/1000 = 1.234
{ -5678,  " = -5.678?r" }, // -5678/1000 = -5.678
{ -9999,  " = -9.999?r" }, // -9999/1000 = -9.999
{  9999,  " =  9.999?r" }, //  9999/1000 = 9.999
{ 10000,  " =  *.***?r" }, // error
{-10000,  " =  *.***?r" }  // error
};
  

Мой код выглядит следующим образом:

 void ST7735_sDecOut3(int32_t n) {
    int32_t msd,nsd, lsd;
    int32_t value;
    value=n;
 if (value > 999)
 {
  value = 999;
 }

 msd = value / 100;
 value -= msd * 100;

 nsd = value / 10;
 value -= nsd * 10;

 lsd = value;

 printf("%d%d%d", msd, nsd, lsd);

}
  

Вывод на ЖК-дисплее выглядит следующим образом:

введите описание изображения здесь

Я выбираю это столько, сколько могу, и это так близко, как я получил до сих пор. Может быть более простой способ, который я не вижу из-за своей неопытности, но я буду продолжать пытаться, потому что это все, что я могу сделать.

Любые подсказки или помощь будут оценены.

Ответ №1:

Это не использует вашу структуру данных или типы, но может быть легко адаптировано для соответствия.

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int values[] = { 0, 4, -5, 78, -254, 999, -1000, 1234, -5678, -9999,  9999, 10000, -10000 };
    enum { NUM_VALUES = sizeof(values) / sizeof(values[0]) };

    for (int i = 0; i < NUM_VALUES; i  )
    {
        int32_t value = values[i];
        char integer[2];
        char fraction[4];
        int f_part = abs(value) % 1000;
        int i_part = abs(value) / 1000;
        char sign = ' ';
        if (abs(value) > 9999)
        {
            strcpy(integer, "*");
            strcpy(fraction, "***");
        }
        else
        {
            if (value < 0)
                sign = '-';
            sprintf(integer, "%d", i_part);
            sprintf(fraction, "%.3d", f_part);
        }
        printf("m: = %c%s.%s?\rn", value, sign, integer, fraction);
    }
    return 0;
}
  

Пример вывода:

      0: =  0.000?r
     4: =  0.004?r
    -5: = -0.005?r
    78: =  0.078?r
  -254: = -0.254?r
   999: =  0.999?r
 -1000: = -1.000?r
  1234: =  1.234?r
 -5678: = -5.678?r
 -9999: = -9.999?r
  9999: =  9.999?r
 10000: =  *.***?r
-10000: =  *.***?r