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

 
 
 
Reply to this topicStart new topic
> звпутался с переменными
AnKing
сообщение Oct 12 2010, 21:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Код
      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 на дисплей, почему?
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 12 2010, 22:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Еще бы знать из какой библиотеки используемые функции cranky.gif
Операцию
Код
itoa(min,mv);
нужно перенести, разместив ее после блока проверки условия. Иначе у вас переменная минут преобразуются в символьный вид только один раз в минуту, а не каждый раз при выводе времени. Отсюда и "растут ноги" вашей ошибки "sec:sec".
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 12 2010, 22:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Цитата(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

Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 12 2010, 22:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Нету у меня ни AVR, ни студии, ни библиотек ейных laughing.gif
Go to the top of the page
 
+Quote Post
dimka76
сообщение Oct 13 2010, 04:05
Сообщение #5


developer
****

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



в stdlib.h функция itoa объявлена так
Код
extern char *itoa(int __val, char *__s, int __radix);


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

И покажите как у вас объявлены mv и sv.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 13 2010, 14:41
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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

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



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 13 2010, 20:27
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



обьявлял так
Код
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?


Сообщение отредактировал AnKing - Oct 13 2010, 20:29
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 13 2010, 20:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дык mv и cv у вас указатели, а где сами буферы-то, указатели на которые вы передаете в itoa и lcd_puts?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 13 2010, 20:45
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AnKing
сообщение Oct 13 2010, 21:08
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 2-02-08
Пользователь №: 34 686



Цитата(Сергей Борщ @ Oct 14 2010, 00:45) *
Указатели, и инициализированы адресами массивов размером... 1 байт ( ="" ). А поскольку такого массива явно не хватает для результата itoa - каждый itoa вылезает за пределы массива и затирает следующие за ним переменные. Надо бы инициализировать либо строкой из хотя бы двух пробелов ( ="<пробел><пробел>") или явно указать размерность массива (не забыв о дополнительном байте для завершающего строку нуля):
Код
char sv[3], mv[3];


Спасибы сергей... все понято )
Go to the top of the page
 
+Quote Post

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

 


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


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