|
Тема
|
Смятане със TTimeStamp?
|
|
Автор |
naki (Power User) |
Публикувано | 12.03.08 17:25 |
|
Имам проблеми с точността на TDateTime (бърка с цяла минута), затова реших да ползвам TTimeStamp. Отдавна не съм писал на C++ Builder (ползвам версия 6) и съм забравил как се прави. Може ли малко помощ?
Целта ми е да се сметне разликата меджу 2 TDateTime стойности и да се сравни с друга TDateTimе стойност. Преобразувам TDateTime стойностите във ТTimeStamp чрез функцията DateTimeToTimeStamp, а после във Comp (която е някаква нестандартна структура, а не прост тип данни) чрез TimeStampToMSecs. Но после имам проблеми със следния ред код:
if(dtMSec-lastMSec>=diffMSec)
компилатора дава грешка на този ред.
Всички променливи в този ред са от тип Comp.
Грешката е [C++ Error] seans.cpp(270): E2015 Ambiguity between '_fastcall System::operator -(double,const Currency &)' and 'Comp::operator double() const'
Какво да направя за да мога да изчисля разликата между 2-те Comp стойности и да я сравня с 3-тата Comp стойност, и да работи правилно?
Редактирано от naki на 12.03.08 17:28.
| |
Тема
|
Re: Смятане със TTimeStamp?
[re: naki]
|
|
Автор |
Formal (незнаещ) |
Публикувано | 13.03.08 13:49 |
|
Ти сигурен ли си, че TDateTime бърка с цяла минута? Да не е нещо друго?
TDateTime всъщност е double, където 1 = 1 ден, т.е. 1 мин = 1/(24*60) = около 0.0007. Заедно с дните, които са 5-цифрени за днешни дати, това прави 9 цифри. Double би трябвало да се оправя без проблем с изваждане на числа от един и същи порядък с много по-голяма точност. Самият тип има точност 16-17 цифри.
За Comp може да пробваш да ги cast-неш към Int64 - Comp си е точно това, нищо че е класифициран при реалните типове. Друг е въпросът, че се поддържа само за backward compatibility.
Редактирано от Formal на 13.03.08 13:50.
| |
Тема
|
Re: Смятане със TTimeStamp?
[re: Formal]
|
|
Автор |
naki (Power User) |
Публикувано | 13.03.08 15:50 |
|
Бърка при изваждане. Тоест date1-date2>=EncodeTime(0,5,0,0) дава резултат ту 6 минути, ту 5 минути.
Оправих проблема, ето крайния код:
TTimeStamp myDiff,diffStamp;
diffStamp=DateTimeToTimeStamp(EncodeTime(Hours,Mins,0,0)); <---това е периода, с който се сравнява
myDiff=DateTimeToTimeStamp(dt-frmMain->lastUpdate);
unsigned __int64 myDiffNum,diffNum; <---- Избягваме ползването на Comp
myDiffNum=myDiff.Date*24*60*60*1000+myDiff.Time; <--- брой милисекунди
diffNum=diffStamp.Date*24*60*60*1000+diffStamp.Time;
if(myDiffNum>=diffNum)
| |
Тема
|
Re: Смятане със TTimeStamp?
[re: naki]
|
|
Автор |
vido (минаващ) |
Публикувано | 13.03.08 16:07 |
|
Щом имаш решение добре, ама не ми се вярва изваждането на две дати да бърка с 1 минута.
Смятъм че (date1 - date2) * 24 * 60 >= 5 ще свърши по- добра работа от онези 7 реда. Винаги по тизи начин смятъм периоди от време. До сега не съм имал проблеми.
| |
Тема
|
Re: Смятане със TTimeStamp?
[re: naki]
|
|
Автор |
Beco_ (Boogie chillun) |
Публикувано | 13.03.08 16:30 |
|
naki, нали знаеш, че в Буилдера има винаги още едно възможно решение - да използваш стандартната С библиотека и ф-иите gettime(), settime(), difftime() ако точноста на разликата м/у двете времена е до секунда.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
| |
|
|
|
|