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

 
 
> Изменение типа переменной, как?
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
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 32)
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
WHALE
сообщение Apr 2 2006, 16:47
Сообщение #16


Знающий
****

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



тебе правильно советуют-прочитай вначале книгу по языку,а более-менее разобравшись
с языком,внимательно прочитай хелп к компилятору.И уверен,ты быстро-бы нашел и разобрался-бы
со следующим(хелп кодвижина)
Standard Library Functions-stdlib.h
void itoa(int n, char *str)
converts the integer n to characters in string str.
в общем,все очень просто


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
raider
сообщение Apr 2 2006, 17:27
Сообщение #17


Частый гость
**

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


Местный
***

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



Действительно, просто надо было юзать поиск....

А вот за функцию огромное спасибо!

з.ы. извините за глупые вопросы...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 18:33
Сообщение #19


Гуру
******

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


Знающий
****

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



и при всем этом еще неплохо было-бы для сравнения глянуть на реализацию библиотечной функции.Библиотеки,как правило,не идиоты пишут. cranky.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 19:36
Сообщение #21


Гуру
******

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



Цитата(WHALE @ Apr 2 2006, 21:26) *
и при всем этом еще неплохо было-бы для сравнения глянуть на реализацию библиотечной функции.Библиотеки,как правило,не идиоты пишут. cranky.gif

1. Далеко не во всех библиотеках есть.
2. Ничего выдающегося там обычно нет - тот-же C, не ASM :-(


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
raider
сообщение Apr 2 2006, 19:48
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 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.
В принципе, если это выкинуть из моей функции, то она превратится в вашу smile.gif но, имхо, человеку все-таки надо и 0 отрисовывать и отрицательные значения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 20:30
Сообщение #23


Гуру
******

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



Цитата(raider @ Apr 2 2006, 21:48) *
В принципе, если это выкинуть из моей функции, то она превратится в вашу smile.gif

Изменения касаются далеко не исключения отрицательных или 0 значений - нужно - верните, а
таких 'мелочей', как лишний промежуточный буфер, лишняя переменная и лишнее умножение.
Не заметили?
В принципе после рассмотрения конкретного компилятора может оказаться желательным исключение
копирования строки.

Кстати, я думаю, что на этом этапе все кончится strftime()
:-))))


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ps1x
сообщение Apr 2 2006, 20:46
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 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:" huh.gif

Что делать?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 2 2006, 20:49
Сообщение #25


Гуру
******

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



Цитата(ps1x @ Apr 2 2006, 22:46) *
По идее он должен выводить время в формате ЧЧ:ММ:СС
Что делать?

Во! Я же буквально пять минут назад говорил, что к strftime() все приползет :-)
Читайте книжки!!!!!!!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Apr 2 2006, 20:59
Сообщение #26


Иногдящий
****

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



Цитата
if (sec<10){lcd_putsf("\0");lcd_puts(temp)

Непонятно - почему если число меньше 10, Вы перед ним выводите не "0", а "\0", то есть не символ "ноль", а символ с нулевым кодом? В этом, скорее всего, проблема.

А вообще, довольно несложно переделать приводившийся Вам код функции, преобразующей число в строку, для того, что бы эта функция сама дополняла нулем числа меньше 10 smile.gif.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 2 2006, 22:56
Сообщение #27


кекс
******

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



Цитата(ps1x @ Apr 2 2006, 18:09) *
Так напишите если не лень конечно.


Да пожалуйста:

Код
var
  Str : String;
  Value : integer;

..
   Value := 3545; // Какое-то число
   Str := ''; // очистить строковую переменную

   while (Value <> 0) do
   begin
       Str := chr( value mod 10 + $30) + Str;
       Value := Value div 10;
   end;
Go to the top of the page
 
+Quote Post
ps1x
сообщение Apr 3 2006, 00:31
Сообщение #28


Местный
***

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



В CVAVR к сожалению, нет функции strftime(), равно как и библеотеки time.h о которой я прочел в интернете (((
Вариант
if (sec<10){lcd_putsf("0");lcd_puts(temp)
почему то тоже не работает, хотя с виду должен...
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 3 2006, 07:17
Сообщение #29


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

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



Совет можт быть не очень к месту, но попробуйте отказаться от CV.
Есть WinAVR и IAR, которые максимально придерживаются стандарта С,
CV и другие упрощены и скорее предназначены для быстрого старта, чем для серьезной работы.
По сути - создать структуру time и выводить ее посимвольно.
Если есть putstr(), то по идее должна быть и putchar().

Сообщение отредактировал beer_warrior - Apr 3 2006, 07:18


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


Знающий
****

Группа: Свой
Сообщений: 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.
А так-же в любой книжке по С в главе с одноименным названием.Одно но-прожорлива,зараза, sad.gif но очень удобна.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 3 2006, 12:54
Сообщение #31


Знающий
****

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



WHALE
В CV функция sprintf не особенно прожорлива; её включение в минимальной конфигурации даёт лишние 600 байт и пару-тройку уровней стека.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
WHALE
сообщение Apr 3 2006, 13:31
Сообщение #32


Знающий
****

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



ну кому как sad.gif мне,если флеш 4к 600 байт с лишним только на индикацию cranky.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
BVU
сообщение Apr 3 2006, 13:47
Сообщение #33


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(WHALE @ Apr 3 2006, 17:31) *
ну кому как sad.gif мне,если флеш 4к 600 байт с лишним только на индикацию cranky.gif

Если такие ограничения памяти программ и стека для микроконтроллера, то функцию 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 Текстовая версия Сейчас: 20th July 2025 - 02:58
Рейтинг@Mail.ru


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