Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Изменение типа переменной
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
В CVAVR:
Есть переменная типа int temp, чтобы ее вывести на экран, нужно использовать функцию
void lcd_puts(char *str);, однако если писать прямо влоб, то оно естесственно ругается:

temp=10;
lcd_putsf(temp);


А теперь вопрос как сделать вывод этой переменной на жк?
AVR
Цитата(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);
beer_warrior
Правильней сказать, как преобразовать число в строку.
В любом случае создать буфер, который будет передаваться в lcd_puts.
Канонический способ sprintf(str,"%d",temp), но функции семесйства printf
чересчур прожорливы из-за своей универсальности.
Неканонический способ - функция itoa(str,temp,10), которая не есть стандартной.
defunct
Цитата(beer_warrior @ Apr 2 2006, 00:02) *
Неканонический способ - функция itoa(str,temp,10), которая не есть стандартной.

Ну и в дополнение надо сказать, что иногда (там где требуется экономия памяти) целесообразно применять собственные функции перевода числа в строку.
Алгоритм (ниже привожу алгоритм а не код) перевода прост:

value - беззнаковое число.
str - строка.

Код
str = "";
while (value)
{
  str = (value % 10 + 0x30) + str;
  value = value / 10;
}
Spider
itoa() smile.gif
ps1x
Цитата(Alexey Belyaev @ Apr 2 2006, 07:10) *
itoa() smile.gif


- а что это за функция, и где она живет? (какой файл *.h)
zltigo
Цитата(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;
}
AVR
Цитата(zltigo @ Apr 2 2006, 15:27) *
И то, что здесь написано, есть бред. Вместо работы с содержимым строки изображены дивные
телодвижения с указателем.
Цитата

str = "";
while (value)
{
str = (value % 10 + 0x30) + str;
value = value / 10;
}



А ведь и вправду, если это язык C++, то тогда это правильный алгоритм преобразования, если же C, то тогда это "дивные телодвижения с указателем". laugh.gif
zltigo
Цитата(AVR @ Apr 2 2006, 14:14) *
А ведь и вправду, если это язык C++, то тогда это правильный алгоритм преобразования

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

написал же, что это не код...
Для алгоритма это надо? Главное чтоб идея была понятна. Остаток от деления числа на 10 добавлять вперед строки, число делить на 10.
zltigo
Цитата(defunct @ Apr 2 2006, 16:22) *
Для алгоритма это надо?

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

Ок, вы правы. Так и буду поступать в дальнейшем.
ps1x
Цитата
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);

????
zltigo
Цитата(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];

Ну а вообще надо заставить себя книжку дочитать!
vet
Цитата(ps1x @ Apr 2 2006, 20:09) *
1. В хелпе к CVAVR ничего про это нет.


В хелпе объясняется каждая функция каждой библиотеки. И про sprintf там тоже есть.
WHALE
тебе правильно советуют-прочитай вначале книгу по языку,а более-менее разобравшись
с языком,внимательно прочитай хелп к компилятору.И уверен,ты быстро-бы нашел и разобрался-бы
со следующим(хелп кодвижина)
Standard Library Functions-stdlib.h
void itoa(int n, char *str)
converts the integer n to characters in string str.
в общем,все очень просто
raider
В общем, вот вам самописная функция преобразования числа в строку:
Код
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.
ps1x
Действительно, просто надо было юзать поиск....

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

з.ы. извините за глупые вопросы...
zltigo
Цитата(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 );
}

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

1. Далеко не во всех библиотеках есть.
2. Ничего выдающегося там обычно нет - тот-же C, не ASM :-(
raider
Цитата(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 отрисовывать и отрицательные значения.
zltigo
Цитата(raider @ Apr 2 2006, 21:48) *
В принципе, если это выкинуть из моей функции, то она превратится в вашу smile.gif

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

Кстати, я думаю, что на этом этапе все кончится strftime()
:-))))
ps1x
Вашему вниманию предлагается следующий кусок кода:
Код
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

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

Во! Я же буквально пять минут назад говорил, что к strftime() все приползет :-)
Читайте книжки!!!!!!!
AndyBig
Цитата
if (sec<10){lcd_putsf("\0");lcd_puts(temp)

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

А вообще, довольно несложно переделать приводившийся Вам код функции, преобразующей число в строку, для того, что бы эта функция сама дополняла нулем числа меньше 10 smile.gif.
defunct
Цитата(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;
ps1x
В CVAVR к сожалению, нет функции strftime(), равно как и библеотеки time.h о которой я прочел в интернете (((
Вариант
if (sec<10){lcd_putsf("0");lcd_puts(temp)
почему то тоже не работает, хотя с виду должен...
beer_warrior
Совет можт быть не очень к месту, но попробуйте отказаться от CV.
Есть WinAVR и IAR, которые максимально придерживаются стандарта С,
CV и другие упрощены и скорее предназначены для быстрого старта, чем для серьезной работы.
По сути - создать структуру time и выводить ее посимвольно.
Если есть putstr(), то по идее должна быть и putchar().
WHALE
Для целей формирования строки вывода на жки лучше подходит фукция sprintf()-форматированный вы-
вод в строку.Например sprintf(buf_indiс," %02.0u%c%02.0u%c%02.0u >>",CHAS,':',MIN,':',SEK);
Находится в stdio.h,в хэлпе описывается в Standard C Input/Output Functions.
А так-же в любой книжке по С в главе с одноименным названием.Одно но-прожорлива,зараза, sad.gif но очень удобна.
vet
WHALE
В CV функция sprintf не особенно прожорлива; её включение в минимальной конфигурации даёт лишние 600 байт и пару-тройку уровней стека.
WHALE
ну кому как sad.gif мне,если флеш 4к 600 байт с лишним только на индикацию cranky.gif
BVU
Цитата(WHALE @ Apr 3 2006, 17:31) *
ну кому как sad.gif мне,если флеш 4к 600 байт с лишним только на индикацию cranky.gif

Если такие ограничения памяти программ и стека для микроконтроллера, то функцию sprintf вообще лучше не использовать! Предпочтительнее написать свою с минимальными требованиями для преобразования.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.