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

 
 
> преобразование числа в строку
sergey sva
сообщение Jan 11 2008, 22:02
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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? не пойму
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
sergeeff Jr.
сообщение Jan 11 2008, 22:19
Сообщение #2


Знающий
****

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



Ну вот тут в самом низу winbatch например написал пример
http://www.daniweb.com/forums/thread32739.html


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 11 2008, 22:44
Сообщение #3


Гуру
******

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



Цитата(sergey sva @ Jan 12 2008, 00:02) *
что это такое и как его заставить преобразовывать в dec? не пойму

Уверены, что у Вас не %o ? Тогда рекомендую серьезно подумать о НЕ использовании впредь этого компилятора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andrеys
сообщение Feb 3 2008, 10:01
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2008, 10:45
Сообщение #5


фанат дивана
******

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



Цитата(Andrеys @ Feb 3 2008, 15:01) *
так объявляю все в начале:
char* str = "777";


Здесь объявлена переменная-указатель на char. И проинициализирована так, что указывает на "777". Эти "777", в зависимости от компилятора, могут располагаться и в ПЗУ.

То есть, надо объявить:
Код
char str[10];


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Andrеys
сообщение Feb 3 2008, 15:02
Сообщение #6


Участник
*

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



Переобъявил, стало получше) спасибо
но числа пока не конвертирует правильно, выводит всякий мусор, видимо %u здесь не подходит?

Сообщение отредактировал Andrеys - Feb 3 2008, 15:04
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2008, 15:04
Сообщение #7


фанат дивана
******

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



Там в IAR как-то надо подключать нужный вариант printf в xcl-файле.
что-то типа

Код
-e_small_write=_formatted_write


Почитайте в документации поподробнее.
------
Пока отвечал, ситуация изменилась:-)

Сообщение отредактировал AHTOXA - Feb 3 2008, 15:06


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Andrеys
сообщение Feb 3 2008, 15:05
Сообщение #8


Участник
*

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



получилось smile.gif код теперь выглядит так

sprintf(str,"%d\n", i);

причем i переменная типа int.
странная особенность, если переменная инт была объявлена внутри main-функции и там использовалась, то конвертируется корректно, при том что точно такая же переменная, только объявленная ВНЕ функций(а потом внутри как extern int), конвертируется в мусор на экране! sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2008, 15:09
Сообщение #9


фанат дивана
******

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



Цитата(Andrеys @ Feb 3 2008, 20:05) *
странная особенность, если переменная инт была объявлена внутри main-функции и там использовалась, то конвертируется корректно, при том что точно такая же переменная, только объявленная ВНЕ функций(а потом внутри как extern int), конвертируется в мусор на экране! sad.gif


Не должно такого быть. Давайте лучше пример кода. Нет ли рядом (в функции) другой переменной с таким же именем?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Feb 3 2008, 15:33
Сообщение #10


Знающий
****

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



Гляньте еще на функции для конвертирования чисел в строки и обратно, такие как atoi и itoa.

Сообщение отредактировал sergeeff Jr. - Feb 3 2008, 15:33


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 3 2008, 18:00
Сообщение #11


Просто Che
*****

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



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

Вот пример моих функций преобразования 2-х байтного бинарного в строку с небольшими возможностями форматирования:
- гашение или негашение незначащих нулей;
- задание кол-ва выводимых знаков;
- вывод десятичной точки в нужном месте для чисел с фиксированной точкой.

В примере в main форматирование регистров программного RTC для вывода на LCD по шаблону времени и даты.
Прикрепленные файлы
Прикрепленный файл  WordToASCII_f.zip ( 1.53 килобайт ) Кол-во скачиваний: 69
 
Go to the top of the page
 
+Quote Post
aspID
сообщение Feb 4 2008, 17:28
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Пожалуй, сюда же добавлюсь. Есть ли у кого идеи, как наиболее оптимально реализовать преобразование 16-ричных данных в строку и обратно? Необходимо в приложении к GSM и кодированию-декодированию текстовых сообщений. На уровне UART ходят текстом 16ричные данные. Вопрос оптимальности стоит довольно строго, поскольку ко всему прочему еще необходимо конвертиться из 8-бит в 7-битовую кодировку (и наоборот, соответственно).
Пока есть только "лобовое" решение, будет прицеплено сюда же часиков через 8 (как только до рабочей машины доберусь)
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 4 2008, 21:59
Сообщение #13


Просто 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;
  }
//==============================================================//
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 4 2008, 22:26
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Andrеys
сообщение Feb 5 2008, 12:15
Сообщение #15


Участник
*

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



Цитата
Не должно такого быть. Давайте лучше пример кода. Нет ли рядом (в функции) другой переменной с таким же именем?

с собой кода нет, но могу ответственно сказать что больше с таким названием у меня переменных нет. я подозреваю ИАР версии 4.12, т.к. после занялся другой задачей - ШИМ для лампочки, поиграться. У меня была переменная pwm, которую по прерыванию раз в определенное время я заносил в OCR2. Естественно, ее объявил вне функций, и изменял ее в main (где объявил экстерном). Позже приведу код, где явное изменение pwm почему-то не происходит, а если добавить некую левую строку, все замечательно работает! поставлю версию 2.31 и опробую на ней.

для ЛСД пользую sprintf(), а stdlib с функцией itoa я не нашел smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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