|
преобразование числа в строку |
|
|
|
Jan 11 2008, 22:02
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Доброй ночи.
такая проблемка нужно преобразовать число unsigned int в символы char ,использую стандартную функцию компилятора sprintf(mass,"%u\n",count); все бы не чего только эта функция преобразует число инт в восьмеричную систему счисления , тоесть если count инкриминируется 1,2,3,4,5,6,7 после идет 10. что это такое и как его заставить преобразовывать в dec? не пойму
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Feb 3 2008, 10:01
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
не стал создавать новую тему, так будет, наверное, лучше. у меня в принципе ниче не выводит, а контроллер исполняет программу 1 раз и встает. в бесконечном цикле причем.
так объявляю все в начале: char* str = "777"; char i=0; это i наращиваю каждый новый цикл.
такой код в бесконечной цикле выводит "777" на дисплей 1 раз, потом исполнение программы прекращается(засекаю по светодиодам специально мигающим на каждый проход)
sprintf(str,"%u\n",i); print(str[0]); print(str[1]); print(str[2]);
никогда не пользовался этой функцией, подскажите в чем неправильность или скажите как надо вообще ей пользоваться?
дисплей символьный 16х2. ф-ия print моя собственная, просто выводит данные на LCD. пишу в ИАР 4.12.
Сообщение отредактировал Andrеys - Feb 3 2008, 10:21
|
|
|
|
|
Feb 3 2008, 10:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Andrеys @ Feb 3 2008, 15:01)  так объявляю все в начале: char* str = "777"; Здесь объявлена переменная-указатель на char. И проинициализирована так, что указывает на "777". Эти "777", в зависимости от компилятора, могут располагаться и в ПЗУ. То есть, надо объявить: Код char str[10];
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 3 2008, 15:02
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
Переобъявил, стало получше) спасибо но числа пока не конвертирует правильно, выводит всякий мусор, видимо %u здесь не подходит?
Сообщение отредактировал Andrеys - Feb 3 2008, 15:04
|
|
|
|
|
Feb 3 2008, 15:04
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Там в IAR как-то надо подключать нужный вариант printf в xcl-файле. что-то типа Код -e_small_write=_formatted_write Почитайте в документации поподробнее. ------ Пока отвечал, ситуация изменилась:-)
Сообщение отредактировал AHTOXA - Feb 3 2008, 15:06
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 3 2008, 15:05
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
получилось  код теперь выглядит так sprintf(str,"%d\n", i); причем i переменная типа int. странная особенность, если переменная инт была объявлена внутри main-функции и там использовалась, то конвертируется корректно, при том что точно такая же переменная, только объявленная ВНЕ функций(а потом внутри как extern int), конвертируется в мусор на экране!
|
|
|
|
|
Feb 3 2008, 15:33
|

Знающий
   
Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964

|
Гляньте еще на функции для конвертирования чисел в строки и обратно, такие как atoi и itoa.
Сообщение отредактировал sergeeff Jr. - Feb 3 2008, 15:33
--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
|
|
|
|
|
Feb 3 2008, 18:00
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
А можно применить и свои, нестандартные функции. Они хоть и обладают урезанной функциональностью, но заточены под свои нужды и имеют компактный код. Вот пример моих функций преобразования 2-х байтного бинарного в строку с небольшими возможностями форматирования: - гашение или негашение незначащих нулей; - задание кол-ва выводимых знаков; - вывод десятичной точки в нужном месте для чисел с фиксированной точкой. В примере в main форматирование регистров программного RTC для вывода на LCD по шаблону времени и даты.
|
|
|
|
|
Feb 4 2008, 21:59
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(aspID @ Feb 4 2008, 19:28)  Есть ли у кого идеи, как наиболее оптимально реализовать преобразование 16-ричных данных в строку и обратно? ... На уровне UART ходят текстом 16ричные данные. ... Вот, можете использовать, накидал по-быстрому. Тут для байтов, но переделать нетрудно: Код //==============================================================// const char Table[16]={'0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'};
char* BinToHex(unsigned char data, char *ptr) { *ptr++ = Table[(data>>4)& 0x0f]; *ptr++ = Table[data & 0x0f]; return ptr; }
//==============================================================// // Convert string of two HEX ASCII chars into binary value // //==============================================================// unsigned char HexToBin(char hi_char, char lo_char) { hi_char -= '0'; if (hi_char > 9) { hi_char &= ~0x20; // Convert lower case to UPPER CASE hi_char -= 'A' - '0' - 0x0A; } lo_char -= '0'; if (lo_char > 9) { lo_char &= ~0x20; // Convert lower case to UPPER CASE lo_char -= 'A' - '0' - 0x0A; } return hi_char<<4 | lo_char; } //==============================================================//
|
|
|
|
|
Feb 4 2008, 22:26
|

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

|
Цитата(Baser @ Feb 5 2008, 00:59)  ....накидал по-быстрому. Торопиться не надо - tolower уже не сработает, да и дважды вычитать тоже никчему - пару лишних команд (если об AVR речь идет). Цитата hi_char -= '0'; if (hi_char > 9) { hi_char &= ~0x20; // Convert lower case to UPPER CASE hi_char -= 'A' - '0' - 0x0A; } Код if (hi_char > '9' ) { hi_char &= ~0x20; // Convert lower case to UPPER CASE hi_char -= ('A' - 10 ); } else hi_char -= '0';
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 5 2008, 12:15
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
Цитата Не должно такого быть. Давайте лучше пример кода. Нет ли рядом (в функции) другой переменной с таким же именем? с собой кода нет, но могу ответственно сказать что больше с таким названием у меня переменных нет. я подозреваю ИАР версии 4.12, т.к. после занялся другой задачей - ШИМ для лампочки, поиграться. У меня была переменная pwm, которую по прерыванию раз в определенное время я заносил в OCR2. Естественно, ее объявил вне функций, и изменял ее в main (где объявил экстерном). Позже приведу код, где явное изменение pwm почему-то не происходит, а если добавить некую левую строку, все замечательно работает! поставлю версию 2.31 и опробую на ней. для ЛСД пользую sprintf(), а stdlib с функцией itoa я не нашел
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|