Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: звпутался с переменными
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
AnKing
Код
      lcd_gotoxy(10, 1);
      
      if(sec==60){
        min++;
        sec=0;
        itoa(min,mv);
      };
      itoa(sec,sv);
      sec++;
    
      lcd_puts(mv);
      lcd_putchar(':');
      lcd_gotoxy(13, 1);
      lcd_puts(sv);

нучто чтобы выводило в формате min:sec а
выводит только sec:sec на дисплей, почему?
rezident
Еще бы знать из какой библиотеки используемые функции cranky.gif
Операцию
Код
itoa(min,mv);
нужно перенести, разместив ее после блока проверки условия. Иначе у вас переменная минут преобразуются в символьный вид только один раз в минуту, а не каждый раз при выводе времени. Отсюда и "растут ноги" вашей ошибки "sec:sec".
AnKing
Цитата(rezident @ Oct 13 2010, 02:14) *
Еще бы знать из какой библиотеки используемые функции cranky.gif
Операцию
Код
itoa(min,mv);
нужно перенести, разместив ее после блока проверки условия. Иначе у вас переменная минут преобразуются в символьный вид только один раз в минуту, а не каждый раз при выводе времени. Отсюда и "растут ноги" вашей ошибки "sec:sec".


вот библиотеки

#include <mega48.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
#include <stdlib.h>
#include <delay.h>

вынес за пределы блока проблема все равно осталась...sec:sec

rezident
Нету у меня ни AVR, ни студии, ни библиотек ейных laughing.gif
dimka76
в stdlib.h функция itoa объявлена так
Код
extern char *itoa(int __val, char *__s, int __radix);


а у вас в вызове ее не хватает еще одного параметра.

И покажите как у вас объявлены mv и sv.
demiurg_spb
Цитата(dimka76 @ Oct 13 2010, 08:05) *
а у вас в вызове ее не хватает еще одного параметра.
мне разные itoa встречались...

Цитата(AnKing @ Oct 13 2010, 01:55) *
...почему?
Какой компилятор используете, небось CV?

AnKing
обьявлял так
Код
char *sv="",*mv="";
int sec=0,min=0;


Вылечил, преобразуя в текст непосредственно перед выводом на экран
Но все равно ен понимаю почему itoa загоняет значения по одному адресу вне зависимости от названия переменных...

Код
itoa(min,mv);              
      lcd_puts(mv);
      lcd_putchar(':');
      lcd_gotoxy(13, 1);
      itoa(sec,sv);
      lcd_puts(sv);


Использую CV...он прост как дримвейвер и встроенный программатор это конеч удобно.
Хотя я бы не прочь освоить чтонить другое.... что посоветуете? IAR?
rezident
Дык mv и cv у вас указатели, а где сами буферы-то, указатели на которые вы передаете в itoa и lcd_puts?
Сергей Борщ
Цитата(rezident @ Oct 13 2010, 23:37) *
Дык mv и cv у вас указатели, а где сами буферы-то, указатели на которые вы передаете в itoa и lcd_puts?
Указатели, и инициализированы адресами массивов размером... 1 байт ( ="" ). А поскольку такого массива явно не хватает для результата itoa - каждый itoa вылезает за пределы массива и затирает следующие за ним переменные. Надо бы инициализировать либо строкой из хотя бы двух пробелов ( ="<пробел><пробел>") или явно указать размерность массива (не забыв о дополнительном байте для завершающего строку нуля):
Код
char sv[3], mv[3];
AnKing
Цитата(Сергей Борщ @ Oct 14 2010, 00:45) *
Указатели, и инициализированы адресами массивов размером... 1 байт ( ="" ). А поскольку такого массива явно не хватает для результата itoa - каждый itoa вылезает за пределы массива и затирает следующие за ним переменные. Надо бы инициализировать либо строкой из хотя бы двух пробелов ( ="<пробел><пробел>") или явно указать размерность массива (не забыв о дополнительном байте для завершающего строку нуля):
Код
char sv[3], mv[3];


Спасибы сергей... все понято )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.