|
Изменение типа переменной, как? |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 32)
|
Apr 1 2006, 21:55
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(ps1x @ Apr 2 2006, 01:44)  В CVAVR: Есть переменная типа int temp, чтобы ее вывести на экран, нужно использовать функцию void lcd_puts(char *str);, однако если писать прямо влоб, то оно естесственно ругается:
temp=10; lcd_putsf(temp);
А теперь вопрос как сделать вывод этой переменной на жк? Очень просто: lcd_putsf((char*)&temp); где (char*) - оператор приведения типа, & - взятие адреса. Но скорее всего такое обращение приведет к чудесным результатам, т.к. функция хочет строчку, которая должна оканчиватсья нулем. Корректнее сделать так: char temp[2]; temp[0] = 10; temp[1] = '\0'; lcd_putsf(temp);
--------------------
|
|
|
|
|
Apr 1 2006, 22:02
|

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

|
Правильней сказать, как преобразовать число в строку. В любом случае создать буфер, который будет передаваться в lcd_puts. Канонический способ sprintf(str,"%d",temp), но функции семесйства printf чересчур прожорливы из-за своей универсальности. Неканонический способ - функция itoa(str,temp,10), которая не есть стандартной.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 1 2006, 23:24
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(beer_warrior @ Apr 2 2006, 00:02)  Неканонический способ - функция itoa(str,temp,10), которая не есть стандартной. Ну и в дополнение надо сказать, что иногда (там где требуется экономия памяти) целесообразно применять собственные функции перевода числа в строку. Алгоритм (ниже привожу алгоритм а не код) перевода прост: value - беззнаковое число. str - строка. Код str = ""; while (value) { str = (value % 10 + 0x30) + str; value = value / 10; }
|
|
|
|
|
Apr 2 2006, 11:27
|

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

|
Цитата(ps1x @ Apr 2 2006, 12:46)  Цитата(Alexey Belyaev @ Apr 2 2006, 07:10)  itoa()  - а что это за функция, и где она живет? (какой файл *.h) 0. Заданный вопрос к изменению "типа переменной" не имеет отношения. 1. Воспользоваться help к компилятору не судьба? 2. Функция не ANSI - может и не быть. Если есть, то обычно stdlib.h ей место. И то, что здесь написано, есть бред. Вместо работы с содержимым строки изображены дивные телодвижения с указателем. Цитата str = ""; while (value) { str = (value % 10 + 0x30) + str; value = value / 10; }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 12:14
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(zltigo @ Apr 2 2006, 15:27)  И то, что здесь написано, есть бред. Вместо работы с содержимым строки изображены дивные телодвижения с указателем. Цитата str = ""; while (value) { str = (value % 10 + 0x30) + str; value = value / 10; }
А ведь и вправду, если это язык C++, то тогда это правильный алгоритм преобразования, если же C, то тогда это "дивные телодвижения с указателем".
--------------------
|
|
|
|
|
Apr 2 2006, 12:59
|

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

|
Цитата(AVR @ Apr 2 2006, 14:14)  А ведь и вправду, если это язык C++, то тогда это правильный алгоритм преобразования Ага, только не забудьте предварительно свой class для 'str' сваять, перегрузить оператор '=' и конструктор копий. При этом Вы естественно, как и положено воспользуетесь в конце концов strspy(), strcat() и прочими str*(). Ибо и конструктор копий и оператор = как и положено в С/C++ занимаются по умолчанию простым копированием адресов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 14:30
|

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

|
Цитата(defunct @ Apr 2 2006, 16:22)  Для алгоритма это надо? Алгоритм на неизвестном языке для человека едва-едва понимающим один из них. НАДО! Если хотите описывать "просто алгоритмы" - пользуйтесь, например, Паскалевским синтаксисом - он как раз под это создавался.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 16:09
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата 0. Заданный вопрос к изменению "типа переменной" не имеет отношения. 1. Воспользоваться help к компилятору не судьба? 2. Функция не ANSI - может и не быть. Если есть, то обычно stdlib.h ей место. 0. Ну уж извиняйте, может это правильней назвать приведение типов? 1. В хелпе к CVAVR ничего про это нет. 2. В stdlib.h есть функция sprinf(); но она у меня правильно не заработала (кривые руки, опилки в голове, глюки протеуса). Цитата Ок, вы правы. Так и буду поступать в дальнейшем. Так напишите если не лень конечно. Ну и вопрос на последок, как же правильно работать с sprinf();? вот так: Код str *temp; int hour; sprintf(temp,"%i",hour); lcd_puts(temp); ????
|
|
|
|
|
Apr 2 2006, 16:30
|

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

|
Цитата(ps1x @ Apr 2 2006, 18:09)  0. Ну уж извиняйте, может это правильней назвать приведение типов? 2. В stdlib.h есть функция sprinf(); но она у меня правильно не заработала (кривые руки, опилки в голове, глюки протеуса).
str *temp; int hour; sprintf(temp,"%i",hour); lcd_puts(temp); 0. Это только для того, что можно "привести". В Вашем случае никаким образом не заставить быть разноразмерные предметы одинаковыми. Преобразование целочисленного значения в ASCII строку. Только вот куда указывает temp и есть-ли там куда он указывает свободное место для размещения получившейся строки.... По тексту это неинециализированный указатель при записи по которому чего-нибудь и порушите, или, как минимум, в пустоту запишите и потом из этой пустоты чего-нибудь прочитаете. Как минимум компилятор должен был выдать вполне определенные ругательства на этот счет. Не стоило их игнорировать. char temp[MAX_SIZE_OF_STRING+1]; Ну а вообще надо заставить себя книжку дочитать!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2006, 16:36
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(ps1x @ Apr 2 2006, 20:09)  1. В хелпе к CVAVR ничего про это нет. В хелпе объясняется каждая функция каждой библиотеки. И про sprintf там тоже есть.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
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
|
|
|