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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Изменение типа переменной, как?
ps1x
сообщение Apr 1 2006, 21:44
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



В CVAVR:
Есть переменная типа int temp, чтобы ее вывести на экран, нужно использовать функцию
void lcd_puts(char *str);, однако если писать прямо влоб, то оно естесственно ругается:

temp=10;
lcd_putsf(temp);


А теперь вопрос как сделать вывод этой переменной на жк?
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 1 2006, 21:55
Сообщение #2


фанат 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);


--------------------
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 1 2006, 22:02
Сообщение #3


Профессионал
*****

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



Правильней сказать, как преобразовать число в строку.
В любом случае создать буфер, который будет передаваться в lcd_puts.
Канонический способ sprintf(str,"%d",temp), но функции семесйства printf
чересчур прожорливы из-за своей универсальности.
Неканонический способ - функция itoa(str,temp,10), которая не есть стандартной.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 1 2006, 23:24
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Spider
сообщение Apr 2 2006, 03:10
Сообщение #5


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



itoa() smile.gif
Go to the top of the page
 
+Quote Post
ps1x
сообщение Apr 2 2006, 10:46
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Цитата(Alexey Belyaev @ Apr 2 2006, 07:10) *
itoa() smile.gif


- а что это за функция, и где она живет? (какой файл *.h)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 11:27
Сообщение #7


Гуру
******

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



Цитата(ps1x @ Apr 2 2006, 12:46) *
Цитата(Alexey Belyaev @ Apr 2 2006, 07:10) *

itoa() smile.gif


- а что это за функция, и где она живет? (какой файл *.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
Go to the top of the page
 
+Quote Post
AVR
сообщение Apr 2 2006, 12:14
Сообщение #8


фанат 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, то тогда это "дивные телодвижения с указателем". laugh.gif


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 12:59
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 2 2006, 14:22
Сообщение #10


кекс
******

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



Цитата(zltigo @ Apr 2 2006, 14:59) *
Ага, только не забудьте предварительно свой class для 'str' сваять, перегрузить оператор '=' и конструктор копий.

написал же, что это не код...
Для алгоритма это надо? Главное чтоб идея была понятна. Остаток от деления числа на 10 добавлять вперед строки, число делить на 10.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 14:30
Сообщение #11


Гуру
******

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



Цитата(defunct @ Apr 2 2006, 16:22) *
Для алгоритма это надо?

Алгоритм на неизвестном языке для человека едва-едва понимающим один из них.
НАДО!
Если хотите описывать "просто алгоритмы" - пользуйтесь, например, Паскалевским синтаксисом -
он как раз под это создавался.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 2 2006, 15:53
Сообщение #12


кекс
******

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



Цитата(zltigo @ Apr 2 2006, 16:30) *
Если хотите описывать "просто алгоритмы" - пользуйтесь, например, Паскалевским синтаксисом -
он как раз под это создавался.

Ок, вы правы. Так и буду поступать в дальнейшем.
Go to the top of the page
 
+Quote Post
ps1x
сообщение Apr 2 2006, 16:09
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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);

????
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 16:30
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 2 2006, 16:36
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(ps1x @ Apr 2 2006, 20:09) *
1. В хелпе к CVAVR ничего про это нет.


В хелпе объясняется каждая функция каждой библиотеки. И про sprintf там тоже есть.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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