Форум: "Основная";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Внизможно увидеть коментарии специалистов!!! 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c