|
Изменение типа переменной, как? |
|
|
|
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 там тоже есть.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|