реклама на сайте
подробности

 
 
8 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопрос С
badik
сообщение Jun 24 2010, 18:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 29-11-06
Из: Екатеринбург
Пользователь №: 22 890



Здравствуйте, Вопрос к людям хорошо знающим С.
Понадобилась функция перевода целого числа в строку. Перерыл спрвочник и help - результат 0.
Банальная проблема. Увы. Обраных функций вагон.
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Jun 24 2010, 18:43
Сообщение #2


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



atoi()/itoa(); Или что-то отсюда...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 24 2010, 18:57
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Тут или пользоваться sprintf (или её вариантами - смотреть в описании Вашего компилятора) или утянуть откуда-нибудь (я в свой проект включил часть исходников библиотечных функций - под именем НЕ совпадающим с библиотечным).
В книге K&R есть пример функции - переделайте под вывод в строку.

Или вот ещё - как можно поступить, если под рукой нет зубной щётки:

Код
void lcd_menu_value(
    unsigned long freq,
    uint_least8_t width,    // full width
    uint_least8_t comma,        // comma position (from right, inside width)
    uint_least8_t rj        // right truncated
    )
{
    static const prog_uint32_t vals [] =
    {
        100000000,
        10000000,
        1000000,
        100000,
        10000,
        1000,
        100,
        10,
        1,
    };
    const unsigned  char j = (sizeof vals /sizeof vals [0]) - rj;
    unsigned  char i = (j - width);
    unsigned  char z = 1;    // only zeroes


    for (; i < j; ++ i)
    {
        ldiv_t res = ldiv(freq, pgm_read_dword(& vals [i]));

        if (comma == (j - i))
        {
            z = 0;
            ws1602_wrdata('.');
        }
        if (z == 1 && (i + 1) < j && res.quot == 0)
            ws1602_wrdata(' ');    // supress zero
        else
        {
            z = 0;
            ws1602_wrdata('0' + res.quot);
        }
        freq = res.rem;
    }
}

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 25 2010, 11:29
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В свое время я задавал такой же вопрос. Получил несколько ответов, в том числе и не очень "полезных и приятных". Сам написал такое:
Код
void si16toad (int16_t Number, char * StrBuf)
{
  char Sign = ' ';
  if (Number > 0) Sign = '+';
  if (Number < 0) {
    Sign = '-';
    Number = -Number;
  }
  StrBuf[6] = '\0';
  signed char i = 5;
  do {
    StrBuf[i--] = Number % 10 + '0';
    Number /= 10;
  } while (Number);
  StrBuf[i] = Sign;
  for (i--; i >= 0; i--) StrBuf[i] = ' ';
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2010, 11:38
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Jun 25 2010, 14:29) *
Сам написал такое

Совет - больше никому "такое" не показывайте, ну если только врагам.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 25 2010, 12:15
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(zltigo @ Jun 25 2010, 15:38) *
Совет - больше никому "такое" не показывайте, ну если только врагам.

Что же в этой функции такого плохого?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jun 25 2010, 12:17
Сообщение #7


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(ViKo @ Jun 25 2010, 15:29) *
В свое время я задавал такой же вопрос. Получил несколько ответов, в том числе и не очень "полезных и приятных". Сам написал такое:

тяжеловесно и потенциально опасно в смысле стрельбы по памяти
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 25 2010, 12:21
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jun 25 2010, 14:38) *
Совет - больше никому "такое" не показывайте, ну если только врагам.

Я хотел приписать, что это один из первых моих "опусов", но подумал, что в качестве примера для изучения сгодится.
Если можете выдать "достойный" образец, прошу!
P.S. У меня знак рисуется непосредственно перед числом, выравнивается по правому краю. А, ну да, можно было применить указатель, но тогда не пришло в голову.
P.P.S. Господа, давайте найдем, наконец, лучшее решение. А то, сколько людей, столько и мнений. Да, я помню высказывание zltigo, что тема избита. Однако...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2010, 12:24
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sonycman @ Jun 25 2010, 15:15) *
Что же в этой функции такого плохого?

Абсолютно все sad.gif. Написано на уровне диалекта "Эллочки людоедки", лишние действия, вычиcления, циклы.

QUOTE (ViKo @ Jun 25 2010, 15:21) *
давайте найдем, наконец, лучшее решение.

А что такое лучшее? Гуано оно всегда гуано, а лучшее, как минимум требует критериев для оценки. Если, например, скорость, то для AVR и 16bit чисел уж точно делений быть не должно, тем более громоздкого сочетания деления и взятия остатка от деления.
А тема, действительно, избитая донельзя. Повторять мамнадцатый раз не вижу смысла.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 25 2010, 12:31
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jun 25 2010, 15:24) *
...лишние действия, вычиcления, циклы...

Оставил только значимую часть сообщения smile.gif
Лучший способ воспитания - на собственном примере.
Покажите, как надо.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 25 2010, 12:38
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ViKo @ Jun 25 2010, 16:31) *
Оставил только значимую часть сообщения smile.gif
Лучший способ воспитания - на собственном примере.
Покажите, как надо.

Особенно интересно, как можно это реализовать без циклов smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2010, 12:41
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Просто как пример:
Код
unsigned int short2str(char *str, unsigned short v, unsigned int slz)
{
    unsigned int a, b, n = 0;
    unsigned long vi;

    vi = v * 26844UL;
    if(v >= 57074) vi -= 13422;    // Вдруг кто скопипастит без проверки
    for(a = 0; a < 5; a++)
    {
        b = vi >> 28;
        if(b || !slz)
        {
            *str++ = b + '0';
            n++;
            slz = 0;
        }
        vi &= ~(0x0f << 28);
        vi *= 10;
    }
    if(!n)
    {
        *str++ = '0';
        n = 1;
    }
    *str++ = 0;
    return n;
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 25 2010, 12:50
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jun 25 2010, 15:24) *
лучшее, как минимум требует критериев для оценки

Я писал для STM32. Виноват, не сказал сразу. Для PIC или AVR написал бы другое "гуано" smile.gif
Критериев, собственно, два - высокое быстродействие и минимальный объем кода. Понятно, что это две крайности, а лучшее лежит где-то посередине.
У вас есть что-нибудь для ARM - Cortex?
И, если можно, выскажитесь о первом примере от Genadi Zawidowsky. И о последующих.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2010, 12:57
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (sonycman @ Jun 25 2010, 15:38) *
Особенно интересно, как можно это реализовать без циклов smile.gif

Ну для этого сначала нужно понимать русский языка, в частности различие между единственным (цикл)и множественным числом (циклы). В данном конкретном случае, когда по неведомым причинам формат фиксирован 6 символами и используются страшные / и % не нужен и единственный цикл.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 25 2010, 13:06
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Jun 25 2010, 15:57) *
В данном конкретном случае, когда по неведомым причинам формат фиксирован 6 символами и используются страшные / и % не нужен и единственный цикл.

int16 укладывается в эти 6 символов, со знаком, ни больше, ни меньше.
В первом цикле вычисляются цифры, во втором забивал пробелами оставшееся место слева. Можно было сразу инициализировать массив пробелами, но было бы ли это эффективнее?
Go to the top of the page
 
+Quote Post

8 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01504 секунд с 7
ELECTRONIX ©2004-2016