Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возня с таймером 
:(
    Опции темы
mr.Anderson
Дата 24.1.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Вот подскажите, в чем дело. Написал в событии OnTimer компонента TTimer вот это:
Код

static int x=Now();
int y=Now();
int res=y-x;
ShowMessage(IntToStr(res));

Объясните, почему всегда выводится сообщение "0"!


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Бегемот
Дата 24.1.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



sim7, ну так потому что функцией Now() в x и y возвращается одно значение! Вот при вычитании ноль и получается!
PM MAIL   Вверх
Partizan
Дата 24.1.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



smile а разве Now() - Now() не равно 0????


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vyacheslav
Дата 25.1.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Бегемот Partizan - Вам двойка по основам С++. Обязательно ноль будет выдан только при первом вызове.
А по существу дела, Now возвращает TDateTime. Вы его переводите в int c помощью неявного вызова оператора
Код

__fastcall operator int() const;

который возращает не тики и милисекунды, как Вы наверное думали, а
Цитата

The resulting integer is the number of days that have passed since 12/30/1899.

Так что, если Вы дадите программе поработает денек, то вы сможете в конце концов вместо нуля получить единицу smile

Если результат нужен в милисекундах, то нужно проделать нечто вроде этого

Код

static TDateTime x=Now();
TDateTime  y=Now();
TDateTime res=y-x;
unsigned short hour;
unsigned short min;
unsigned short sec;
unsigned short msec;
res.DecodeTime(&hour , &min, &sec, &msec);
long ms =  hour*60*60*1000 + min*60* 1000 + sec*1000 + msec;
ShowMessage( ms);




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Partizan
Дата 25.1.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



Vyacheslav Просто мне не встречалась ещё функция Now() и я подумал, что Now() это функция, которую определил он сам....думаю и Бегемот так же подумал....

теперь буду знать что это за функция такая Now()...

з.ы. не знал что функция now - это одна из основ... smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vyacheslav
Дата 25.1.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Следующий раз придется объяснять досконально. Похоже 2 - это завышенная оценка smile
Здесь основа из основ не Now, a static.

А по сему в
Код

static int x=Now();
int y=Now();
int res=y-x;

x == y только при первом проходе. При последующих проходах x сохраняет первоначальное значение, а y каждый раз инициализируется заново и логично предположить, что это новое значение может уже не равно x.

И вопрос был
Цитата

Объясните, почему всегда выводится сообщение "0"!

Подчеркиваю "всегда", а не при первом проходе.

Кстати одна только конструкция типа
Код

static int x=Now();
int y=Now();

могла навести на мысль, что Now при каждом вызове должен выдавать разные значение,даже не зная для чего эта функция предназначена.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Partizan
Дата 25.1.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



не надо меня учить....я знаю чем характеризуется static и зачем он нужен...
я же вам объяснил что я подумал что это его функция, и предположил, что она выполняет одни и те
же действия с одними и теми же данными(исходя из пустого списка с параметрами...) и возвращает одно и то же значение( исходя из того, что вызывается 2 раза подряд одна и та же конструкция!!!(ЕЩЁ РАЗ ПОВТОРЯЮ Я НЕ ЗНАЛ ЧТО NOW возвращает прик каждом выхове разное значение или по крайней мере должна возвращать...))...

дабы вы меня вновь не поняли привратно, привожу пример:

Код

int Now(){
 int a = 0;
 int b = 10;
 return a+b;
}

и в OnTimer
{
static int x=Now();    
int y=Now();    
int res=y-x;
}


res всегда будет равно 0 вне зависимости от того X объявлен статической переменной или нет...
вся ошибка была всего навсего в незнании функции Now()...ещё раз повторяю...

з.ы. я ж не телепат чтобы сразу знать что делает функция сразу как только я увидел её использование в программе...

если бы он указал явно чем занимается функция Now(), получил бы совсем другие ответы

Это сообщение отредактировал(а) Partizan - 25.1.2006, 17:14


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Vyacheslav
Дата 25.1.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Partizan @ 25.1.2006, 16:59 Найти цитируемый пост)

дабы вы меня вновь не поняли привратно, привожу пример:

Совершенно бесмысленных примеров можно привести сколько угодно, так же как совершенно бесмысленных ответов.
А отвечая на вопросы нужно исходить, как мне кажется, хотя бы из приципа разумности, тем более что применения static в такой ситуации говорит само за себя, а не накручивать себе счетчик ответами
Цитата(Partizan)

а разве Now() - Now() не равно 0????






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Бегемот
Дата 25.1.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



Да, функция Now() после всех преобразований возвращает количество дней, но возвращает-то она не целое число, а нечто такое:
x = 38741.8228037
y = 38741.8228157
А так как Now() возвращает эти числа в переменные типа int, мы получаем целое число 38741 как в x, так и в y! Ну и при их вычитании получаем ноль! Ну, если, конечно, сутки не будем ждать!

Цитата

Бегемот Partizan - Вам двойка по основам С++.


p.s: Vyacheslav, а мОнА хотя бы троечку с минусом? smile Ну, или пускай двойка, тогда хотя бы не в дневник. smile

PM MAIL   Вверх
Vyacheslav
Дата 25.1.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ладно уговорил smile

Все таки Now возвращает TDataTime
Код

extern PACKAGE System::TDateTime __fastcall Now(void);

А для TDataTime определены операторы преобразования
Код

__fastcall TDateTime::operator double() const;

Который возращает число, целая часть которого количество дней, дробная часть дня
и оператор

Код

__fastcall TDateTime::operator int() const;


И если имеется код
Код

double x = Now();

или
Код

int x = Now();


эти операторы вызываются неявно


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 25.1.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Почитал-почитал, так и не понял, почему же в данном случае не срабатывает static. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Бегемот
Дата 25.1.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



sim7, срабатывает, срабатывает static!
Вот тебе результаты нескольких вызовов обработчика события OnTimer с интервалом в одну секунду!

x = 38742.9015837
y = 38742.9015837
res = 0.0000007

x = 38742.9015837
y = 38742.9015957
res = 0.0000127

x = 38742.9015837
y = 38742.9016077
res = 0.0000237

x = 38742.9015837
y = 38742.9016187
res = 0.0000357

x = 38742.9015837
y = 38742.9016307
res = 0.0000467

x = 38742.9015837
y = 38742.9016417
res = 0.0000587

.....а через сутки res гордо примет значение единицы!
Как видишь, static выкладывается по полной программе, упорно храня в x то значение, которое он(x) получил при первом вызове обработчика! При этом y изменяется (увеличивается) при каждом вызове обработчика! smile

Vyacheslav!
Цитата

Обязательно ноль будет выдан только при первом вызове

Цитата

x == y только при первом проходе

Смотрю по отладчику! Невижу ничего подобного! Почему?! smile


PM MAIL   Вверх
Vyacheslav
Дата 26.1.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



smile Как это не видишь
Код

x = 38742.9015837
y = 38742.9015837

правда непонятнно, почему у тебя
res = 0.0000007.
Добавлено @ 10:37
Цитата(sim7 @ 25.1.2006, 19:21)
Почитал-почитал, так и не понял, почему же в данном случае не срабатывает static.  smile

Ну как еще объяснить? smile
Причем тут static, с ним то все в порядке. По своему алгоритму Вы дни считаете.
Ну не понимаете, наберите просто этот код и посмотрите
Код

static TDateTime x=Now();
TDateTime  y=Now();
TDateTime res=y-x;
unsigned short hour;
unsigned short min;
unsigned short sec;
unsigned short msec;
res.DecodeTime(&hour , &min, &sec, &msec);
long ms =  hour*60*60*1000 + min*60* 1000 + sec*1000 + msec;
ShowMessage( ms);


Или хотя бы, этот
Код

static double x=Now();
ShowMessage( Format("%.7f",ARRAYOFCONST(((double)Now()-x))));



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Partizan
Дата 26.1.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 67



Vyacheslav согласен, что логичнее было спросить сначала чем занимается функция Now()... моя ошибка...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mr.Anderson
Дата 26.1.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Ах, дни! Вона что! То есть у меня сравниваются-то дни? То есть вот почему после суток значение 1 будет... (я не проверял, конечно, верю на слово smile ). Ладно. Теперь постараюсь понять, как сделать сравнение миллисекунд. Нда. Буду разбираться.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Бегемот
Дата 26.1.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



Упс!
Vyacheslav...видимо вчера я смотрел мимо монитора smile
НО!
Цитата

x = 38742.9015837
y = 38742.9015837
res = 0.0000007
....

Это то, что я скопировал из текстового файла, в который сохранял результаты при каждом вызове обработчика! Честно говоря, для меня остаётся непонятным почему в файл было записанно такое значение переменной res! smile
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.