Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.23;
Скачать: CL | DM;

Вниз

можно увидеть коментарии специалистов!!! Frac(***)-Error   Найти похожие ветки 

 
SergeyDon   (2003-12-09 14:29) [0]

procedure ---.FormCreate(Sender: TObject);
const b : array[0..7] of byte = ($ff,$ff,$ff,$ff,$df,$85,$e2,$40);
const c : array[0..7] of byte = ($00,$00,$00,$00,$e0,$85,$e2,$40);
var st1,st2 : string;
dt1 : TDateTime;
dt2 : TDateTime;
P:pointer;
begin
p:=@dt1;
MoveMemory(p,@b,8);
p:=@dt2;
MoveMemory(p,@c,8);
st1:=FormatDateTime("d.m.y / h:n:s:z",dt1);
st2:=FormatDateTime("d.m.y / h:n:s:z",dt2);
if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi no BAG");
if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi BAG");
end;


 
Murad ©   (2003-12-09 14:40) [1]

Так что здесь не так... что тебе не нравится... что вообще происходит.. и где в этом коде Frac(***) ???!!!


 
Skier ©   (2003-12-09 14:43) [2]

MoveMemory(p ^,@b,8);
p:=@dt2;
MoveMemory(p ^,@c,8);


 
Digitman ©   (2003-12-09 14:45) [3]

для начала строчки

p:=@dt1;
MoveMemory(p,@b,8);
p:=@dt2;
MoveMemory(p,@c,8);

замени на

dt1:=PDateTime(@b)^;
dt2:=PDateTime(@c)^;

никчему эти извращения с явным копированием - компилятор все сделает сам и , как видишь, гораздо изящней-эффективней

ты хочешь сказать, что при выполнении первой же строчки с CompareTime() фозникает исключение ?


 
Skier ©   (2003-12-09 14:46) [4]

Oops !
MoveMemory(p^,b,8);
p:=@dt2;
MoveMemory(p^,c,8);

Брать указатель не нужно...


 
Skier ©   (2003-12-09 14:54) [5]

Нужно ещё кастить на Pointer
MoveMemory(Pointer(p^),b,8);

И будет полный изврат...ищи другое решение...см. [3]


 
Murad ©   (2003-12-09 14:55) [6]

Особенно меня радует в этом коде что сообщения об отсутствии (присутствии) ошибки светятся при одинаковых условиях :))))

if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi no BAG");

if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi BAG");


 
Skier ©   (2003-12-09 15:06) [7]

Мда...что-то я бред написал...
Но всё равно не пойму причём тут MoveMemory ?


 
Digitman ©   (2003-12-09 15:07) [8]


> сообщения об отсутствии (присутствии) ошибки светятся при
> одинаковых условиях


что значит "светятся" ? ты же САМ последовательно выводишь оба диал.окна ! Условие-то одинаково и там и там, тексты сообщений лишь разные

и где здесь "ошибка" ? условие действительно выполняется, ибо содержимое переменных dt1 и dt2 действительно различно


 
Digitman ©   (2003-12-09 15:08) [9]


> Skier © (09.12.03 15:06) [7]


> всё равно не пойму причём тут MoveMemory


ну надо ему копию сделать !

мало ли чего он задумал)


 
Murad ©   (2003-12-09 15:08) [10]

2Digitman © Я о том и говорю... я не автор этой ветки.. вы меня так не позорьте :))))


 
Skier ©   (2003-12-09 15:10) [11]


> ну надо ему копию сделать !

хм...какой-то странный способ,вестимо...


 
Murad ©   (2003-12-09 15:11) [12]

Похоже автор нам больше ничего не ответит - предлагаю считать эту ветку - провокацией...


 
Digitman ©   (2003-12-09 15:14) [13]


> Murad


я дико извиняюсь !)


 
Murad ©   (2003-12-09 15:15) [14]

2Digitman ©
Ничего, бывает :)))

Если автора нет - то надо выбрать "кто за него" :)))))


 
Digitman ©   (2003-12-09 15:18) [15]

я уж тут грешным делом подумал, что "глюк" какой-то в CompareTime() в Д7 ... ведь на самом деле ф-ция по идее должна обращаться к Frac() ... а проверить не могу, Д5.5 под рукой только ...


 
Murad ©   (2003-12-09 15:25) [16]

2Digitman ©
Frac может вызываться и в FormatDateTime, которая в этом коде вообще непонятно для чего вызывается :)))


 
icWasya ©   (2003-12-09 16:57) [17]

наверно должно быть
if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi no BAG");
if CompareTime(dt1,dt2)=0 then
ShowMessage("Delphi BAG");


а вопрос был такой :
почему
st1="10.11.2003 / 0:0:0:0";
и
st2="10.11.2003 / 0:0:0:0";

а

CompareTime(dt1,dt2)<>0
???

фишка здесь в том, что const b - это точно "10.ноября.2003 / 00:00:00:000" , а const c - это
"9.ноября.2003 / 23:59:59:999 999 371"

если вызвать функцию CompareDateTime(dt1,dt2), то она покажет, что эти даты равны, а если вызвать CompareTime(dt1,dt2), то выяснится, что 24 часа<>0


 
Digitman ©   (2003-12-09 17:06) [18]


> icWasya


это все понятно)

непонятно что есть "Frac(***)-Error ")


 
SergeyDon   (2003-12-09 17:14) [19]

Во первых прошу прощение опечатачка вышла правильно так:
if CompareDateTime(dt1,dt2)<>0 then
ShowMessage("Delphi no BAG");
if CompareTime(dt1,dt2)<>0 then
ShowMessage("Delphi BAG");

А вопроc та вовсе не по работе с памятью!
а втом что если посмотреть st1=st2 а
CompareDateTime <> CompareTime
при вызове CompareTime используется вызов Frac().
в масиве b и c (дамп памяти, я просто для примера упростил)
хранится представление дат равных между собой но при сравнении оказывается что это не так!!!
В принцыпе эта ветка пошла просто для информации вдруг кто сталкнётся с такой проблемой, чтобы долго не парились а знали что и так бывает. мне интересно было кто как борится с этой проблемой.


 
Digitman ©   (2003-12-09 17:18) [20]


> хранится представление дат равных между собой


не соответствует действительности


> вдруг кто сталкнётся с такой проблемой


проблемы вообще нет никакой - все вполне понятно и очевидно


 
KSergey ©   (2003-12-09 17:30) [21]

> [17] icWasya © (09.12.03 16:57)
> а вопрос был такой :

Не, ну можем же напрячь телепатические способности, когда хотим, а? ;)
А то вечно вопрос им разжуй, чуть что не так - "телепатов здесь нет!", а тут и вопроса-то нет - а какое обсуждение!! Или это только я недалекий ничего не понял? ;)


 
SergeyDon   (2003-12-10 09:29) [22]

для окончания могу лиш только сказать, что ситуация возникает по непонятным для меня причинам.
есть база в которой есть поле DateTime. Обращаюсь к базе например к полю 24 читаю дату и данные получаю дату в виде
"10.11.2003 / 0:0:0:0":$00,$00,$00,$00,$e0,$85,$e2,$40
а если в запросе читать поля 20-30 то в поле 24 получаю дату в виде
"10.11.2003 / 0:0:0:0":$ff,$ff,$ff,$ff,$df,$85,$e2,$40
при сравнении как CompareDateTime то всё ОК! так как нет вызова Frac, а сравнивается только (dt1-dt2)
при сравнении как CompareTime то всё noОК! так как есть вызов Frac, и при сравнении получаем сотые-милисикунды разници.



Страницы: 1 вся ветка

Текущий архив: 2003.12.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
1-75247
Nucl
2003-12-09 15:00
2003.12.23
Чистилка кода


14-75331
Knight
2003-11-25 23:33
2003.12.23
Кто какими сотовыми пользуется?


4-75452
Dimonn
2003-10-28 11:19
2003.12.23
VirtualAlloc


14-75343
Holy
2003-11-24 00:51
2003.12.23
Организация встречи. Белгород.


14-75394
alex134
2003-11-28 00:16
2003.12.23
Форум ВебМастеров