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

 
 
 
Reply to this topicStart new topic
> C18 Ограничения sprintf
Auratos
сообщение Nov 3 2015, 13:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032



Добрый день. У меня есть число типа float. Необходимо его записать в массив, дополнив целую и дробную части до определенного размера нулями. С целой частью проблем нет, дробную пока не получилось дополнить нулями. Но проблема в другом: sprintf отказывается принимать числа больше int. Подскажите, пожалуйста, как можно ли как-то обойти это ограничение? Может быть в настройках компилятора что-то включить? Среда разработки - MPLab X IDE. Вот пример кода, где я использую sprintf

Код
void main(void)
{
    float minSet1 = 0.5;
    unsigned char Setting[11] = "          ";
    NumbConverter(Setting, minSet1, 36);
}


void NumbConverter (void* destination, float numb, unsigned char numbDecimal)
{
    unsigned char* array = (unsigned char*)destination;
    unsigned int whole;
    unsigned long decimal;
    whole = numb;                                           // целая часть
    switch (numbDecimal)
    {
        case 36:
            decimal = (numb - whole) * 1000000;             // дробная часть
            sprintf((char*)array, (const far rom char*)"%03d.%06u", whole, decimal);
            break;
        case 43:
            decimal = (numb - whole) * 1000;                // дробная часть
            sprintf((char*)array, (const far rom char*)"%04d.%03u", whole, decimal);
            break;
        case 46:
            decimal = (numb - whole) * 1000000;             // дробная часть
            sprintf((char*)array, (const far rom char*)"%04d.%06u", whole, decimal);
            break;
    }
}


На выходе я получаю массив Setting с содержимым "000.000007" вместо "000.500000". Не знаю, как быть
Go to the top of the page
 
+Quote Post
megajohn
сообщение Nov 3 2015, 13:24
Сообщение #2


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



для unsigned long нужно применять lu
читать здесь
эксперементировать здесь


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Auratos
сообщение Nov 5 2015, 05:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032



megajohn, большое спасибо за помощь. До этого пробовал %u, %ul, но не работало
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 5 2015, 07:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(megajohn @ Nov 3 2015, 16:24) *
читать здесь
Из википедии может сложиться впечатление, что форматные строки printf и scanf одинаковые, потому что для scanf там рассмотрены самые примитивные случаи. На самом деле форматные строки существенно отличаются, поэтому читать лучше здесь. Дома попробую найти ссылку на еще более подробное описание.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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