|
|
  |
Изменение типа переменной, как? |
|
|
|
Apr 2 2006, 17:27
|
Частый гость
 
Группа: Свой
Сообщений: 117
Регистрация: 11-05-05
Из: г. Москва
Пользователь №: 4 916

|
В общем, вот вам самописная функция преобразования числа в строку: Код char *int2str(char *buf, int num) { char str[6]; char *ptr = &str[5]; int tmp;
*ptr = 0;
if (num < 0) { *buf++ = '-'; num = -num; }
do { tmp = num / 10; *--ptr = '0' + (num - tmp * 10); num = tmp; } while (num != 0);
while ((*buf++ = *ptr++) != 0);
return buf - 1; } у себя делаете: Код int temp; char str_buf[7];
temp=10; int2str(str_buf, temp); lcd_putsf(str_buf); естественно, int - 16-и разрядный. И будет у вас на индикаторе в десятичной системе счисления число за переменной temp.
|
|
|
|
|
Apr 2 2006, 18:33
|

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

|
Цитата(raider @ Apr 2 2006, 19:27)  В общем, вот вам самописная функция преобразования числа в строку: Заумно, много лишнего. Код void int2str( char *buf, int num ) { char *ptr = buf+5; *ptr = 0; while( num ) { *--ptr = num%10 + '0'; num /= 10; } strcpy( buf, ptr ); } Это просто "по мотивам" цель написать оптимальную не ставилась.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 19:48
|
Частый гость
 
Группа: Свой
Сообщений: 117
Регистрация: 11-05-05
Из: г. Москва
Пользователь №: 4 916

|
Цитата(zltigo @ Apr 2 2006, 22:33)  Заумно, много лишнего. Код void int2str( char *buf, int num ) { char *ptr = buf+5; *ptr = 0; while( num ) { *--ptr = num%10 + '0'; num /= 10; } strcpy( buf, ptr ); } А если num = 0? А если num < 0, ведь оно типа int. В принципе, если это выкинуть из моей функции, то она превратится в вашу  но, имхо, человеку все-таки надо и 0 отрисовывать и отрицательные значения.
|
|
|
|
|
Apr 2 2006, 20:30
|

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

|
Цитата(raider @ Apr 2 2006, 21:48)  В принципе, если это выкинуть из моей функции, то она превратится в вашу  Изменения касаются далеко не исключения отрицательных или 0 значений - нужно - верните, а таких 'мелочей', как лишний промежуточный буфер, лишняя переменная и лишнее умножение. Не заметили? В принципе после рассмотрения конкретного компилятора может оказаться желательным исключение копирования строки. Кстати, я думаю, что на этом этапе все кончится strftime() :-))))
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 20:46
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Вашему вниманию предлагается следующий кусок кода: Код if (blink==1)//для реализации мигания активного параметра { itoa(hour,temp);//переводим int в str if (hour<10){lcd_putsf("\0");lcd_puts(temp);}else{lcd_puts(temp);}//если часов меньше 10 то добавляем перед цифрой часов цифру "0", наверное трабл здесь. lcd_putsf(":");//Выводим разделитель itoa(min, temp); //переводим минуты if (min<10){lcd_putsf("\0");lcd_puts(temp);}else{lcd_puts(temp);}//если минут меньше 10 то -----""----- lcd_putsf(":");//разделитель itoa(sec, temp); if (sec<10){lcd_putsf("\0");lcd_puts(temp);}else{lcd_puts(temp);} } else {//здесь все тоже самое только, вместо часов мы выводим " " - два пустых знака. lcd_putsf(" "); lcd_putsf(":"); itoa(min, temp); if (min<10){lcd_putsf("\0");lcd_puts(temp);}else{lcd_puts(temp);} lcd_putsf(":"); itoa(sec, temp); if (sec<10){lcd_putsf("\0");lcd_puts(temp);}else{lcd_puts(temp);} } По идее он должен выводить время в формате ЧЧ:ММ:СС однако если число минут, часов или секунд меньше десяти он их не выводит вообще например вместо "06:32:09" получится ":32:"  Что делать?
|
|
|
|
|
Apr 2 2006, 20:59
|

Иногдящий
   
Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931

|
Цитата if (sec<10){lcd_putsf("\0");lcd_puts(temp) Непонятно - почему если число меньше 10, Вы перед ним выводите не "0", а "\0", то есть не символ "ноль", а символ с нулевым кодом? В этом, скорее всего, проблема. А вообще, довольно несложно переделать приводившийся Вам код функции, преобразующей число в строку, для того, что бы эта функция сама дополняла нулем числа меньше 10  .
|
|
|
|
|
Apr 3 2006, 07:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Совет можт быть не очень к месту, но попробуйте отказаться от CV. Есть WinAVR и IAR, которые максимально придерживаются стандарта С, CV и другие упрощены и скорее предназначены для быстрого старта, чем для серьезной работы. По сути - создать структуру time и выводить ее посимвольно. Если есть putstr(), то по идее должна быть и putchar().
Сообщение отредактировал beer_warrior - Apr 3 2006, 07:18
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 3 2006, 08:41
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Для целей формирования строки вывода на жки лучше подходит фукция sprintf()-форматированный вы- вод в строку.Например sprintf(buf_indiс," %02.0u%c%02.0u%c%02.0u >>",CHAS,':',MIN,':',SEK); Находится в stdio.h,в хэлпе описывается в Standard C Input/Output Functions. А так-же в любой книжке по С в главе с одноименным названием.Одно но-прожорлива,зараза,  но очень удобна.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|