|
|
  |
Вопрос С |
|
|
|
Jun 24 2010, 18:29
|
Участник

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

|
Здравствуйте, Вопрос к людям хорошо знающим С. Понадобилась функция перевода целого числа в строку. Перерыл спрвочник и help - результат 0. Банальная проблема. Увы. Обраных функций вагон.
|
|
|
|
|
Jun 24 2010, 18:57
|

Профессионал
    
Группа: Участник
Сообщений: 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; } }
|
|
|
|
|
Jun 25 2010, 12:21
|

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

|
Цитата(zltigo @ Jun 25 2010, 14:38)  Совет - больше никому "такое" не показывайте, ну если только врагам. Я хотел приписать, что это один из первых моих "опусов", но подумал, что в качестве примера для изучения сгодится. Если можете выдать "достойный" образец, прошу! P.S. У меня знак рисуется непосредственно перед числом, выравнивается по правому краю. А, ну да, можно было применить указатель, но тогда не пришло в голову. P.P.S. Господа, давайте найдем, наконец, лучшее решение. А то, сколько людей, столько и мнений. Да, я помню высказывание zltigo, что тема избита. Однако...
|
|
|
|
|
Jun 25 2010, 12:24
|

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

|
QUOTE (sonycman @ Jun 25 2010, 15:15)  Что же в этой функции такого плохого? Абсолютно все  . Написано на уровне диалекта "Эллочки людоедки", лишние действия, вычиcления, циклы. QUOTE (ViKo @ Jun 25 2010, 15:21)  давайте найдем, наконец, лучшее решение. А что такое лучшее? Гуано оно всегда гуано, а лучшее, как минимум требует критериев для оценки. Если, например, скорость, то для AVR и 16bit чисел уж точно делений быть не должно, тем более громоздкого сочетания деления и взятия остатка от деления. А тема, действительно, избитая донельзя. Повторять мамнадцатый раз не вижу смысла.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 25 2010, 12:50
|

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

|
Цитата(zltigo @ Jun 25 2010, 15:24)  лучшее, как минимум требует критериев для оценки Я писал для STM32. Виноват, не сказал сразу. Для PIC или AVR написал бы другое "гуано"  Критериев, собственно, два - высокое быстродействие и минимальный объем кода. Понятно, что это две крайности, а лучшее лежит где-то посередине. У вас есть что-нибудь для ARM - Cortex? И, если можно, выскажитесь о первом примере от Genadi Zawidowsky. И о последующих.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|