![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при работе программы, идет остановка, как при трасировке..
Elena © (2005-02-04 09:55:00)Доброе время суток всем. Простите за глупый вопрос, но не знаю куда еще обратиться...
В данном цикле есть много if вложенных и хоть остановка не стоит , при отладке программы , делфи все равно останавливается. В чем может быть причина ошибка делфи или алгоритма?
while not DM.Table2.Eof do
begin
for j:=1 to i do
begin
dka:=-1;
dkp:=-1;
if then
begin
if условие then
begin
dka:=число;
end;
end;
if условие then
begin
if then
begin
dkp:=число
end
end;
if (dka<>-1) and (dkp<>-1) then
begin
действие
end
else
begin
if (dka=-1) and (dkp<>-1) then
begin
действие
end
else
begin
if (dka<>-1) and (dkp=-1) then
begin
действие
end
end;
if (dka=-1) and (dkp=-1) then
действие
end;
end;
DM.Table2.Next;
end;
на выделенном if всегда идет остановка....
Elena (2005-02-04 14:49:00) [21]_vox_фукция okr это округление до 1000 по такому алгоритму весь я его не превожу, так как данный блок просто несколько раз повторяется, меняется только порядок.
k:=ch*100;
k1:=k+0.5;
k2:=trunc(k1);
k2:=k2/100;
ch:=k2;
DM_date.masdat[j] это массив дат, причем не динамический, так как всего лишь от 1 до 31.
Elena (2005-02-04 14:38:00) [22]ЛЮДИ это моя первая программа, в последующих я использовала и currency и запросы, когда уже писала сетевые проги и т.п. эта была написанна год назад, это локальная прога, таблички парадоксовские, если можно использовать индексы то почему бы и нет. Сейчас год спустя после ее сдачи мне надо сделать доработку, она небольшая по сравнению со всей прогой,прога очень громозка и переписать ее пока нет возможности так как на мне очень много задач висит, поэтому, пожалуйста, кто-нибудь может сказать что-нибудь по данному вопросу?
_vox_ (2005-02-04 14:31:00) [23]имхо остается два варианта
1.надо копать глубже - смотреть функцию Okr и DM_date.masdat[j]. Большая часть "чудес" возникает из-за неправильной работы с памятью.
2.ошибка Delphi
msguns (2005-02-04 14:29:00) [24]Кстати, бог с ними, с запросами, можно обойтись и без них. А вот почему нельзя загнать текущие курсы в массив и шариться по нему, вместо того чтобы прыгать по таблице ? Ведь валют не может быть тысячи, как и счетов (если это не банк, конечно)
msguns (2005-02-04 14:25:00) [25]О боже, никогда еще не видел, чтоб так хитровыстиранно пересчитываались валюты. А что, на запросы в конторе вето ?
>Александр Иванов © (04.02.05 14:16) [18]
>(value2-value1)<0.000001
Очень ценное замечание при работе с флоатом.
Кстати, а какая необходимость была поле курса в БД вешать на флоат ?
Elena (2005-02-04 14:23:00) [26]Александр Иванов © ,esu ©
хорошо сравнение это не проблема делаю trunc и все , на сколько я знаю сравнение целых чисел вполне корректно. Но ситуацию это не спасает.....уже проверила....
Александр Иванов (2005-02-04 14:16:00) [27]Elena © (04.02.05 14:14) [17]
Вещественные числа принято сравнивать так:
(value2-value1)<0.000001
Elena (2005-02-04 14:14:00) [28]а в чем некорректность сравнения 2-х чисел? С currency учту на будущие, но сейчас переписывать все нафиг....
и почему думаете что данный код будет некорректно работать? объясните, пожалуйста. :-)
esu (2005-02-04 13:45:00) [29]мда, ну вам этот код и насчитает...
Вообщем некорректно прямое сравнение dka, dkp с 1 или -1. Ну и delphi видимо дает по этому поводу немой намек (хотя должен бы и не немой)
Если вы считаете деньги нужно использовать currency... Но это все в любом случае лучше "переписать нафиг" (c)
Elena (2005-02-04 13:42:00) [30]>R © (04.02.05 13:16) [5]
А останов выглядит как, я имею ввиду красное выделение строки или иное...
Простите не ответила не увидела, строка выделяется синем цветом, как пошаговой трасировке, т.е. как при нажатии клавиши F7.
Elena (2005-02-04 13:34:00) [31]double
Elena (2005-02-04 13:31:00) [32]dka и dkp это переменные, получаемые путем взятия из одной таблицы валюту перемножаемую на курс, т.е. если они изменяются, то становятся или положительными или нулем. При пошаговом просмотре все идет хорошо, т.е. как надо так и идет. Сейчас попробую вообще избавиться от этих if, только вот все равно интересно в чем же ошибка, чтобы на будущие в это опять не вляпаться....
esu (2005-02-04 13:31:00) [33]А какой тип у этих dka, dkp ?
Elena (2005-02-04 13:26:00) [34]DM.Table2.First;
while not DM.Table2.Eof do
begin
for j:=1 to i do
begin
dka:=-1;
dkp:=-1;
s:=datetostr(DM_date.masdat[j]);
sd:=copy(s,1,2);
if DM.temp2.FindKey([DM_date.masdat[j],'840',DM.Table2.FieldByName('Schet').AsString])=true then
begin
if DM.Kurs.FindKey([DM_date.masdat[j],'840'])=true then
begin
dka:=DM.temp2.fieldbyname('3_s').AsFloat*DM.Kurs.fieldbyname('kurs').AsFloat;
Unit1.okr(dka);
end;
end;
if DM.temp2.FindKey([DM_date.masdat[j],'978',DM.Table2.FieldByName('Schet').AsString])=true then
begin
if DM.Kurs.FindKey([DM_date.masdat[j],'978'])=true then
begin
dkp:=DM.temp2.fieldbyname('3_s').AsFloat*DM.Kurs.fieldbyname('kurs').AsFloat;
Unit1.okr(dkp);
end
end;
if (dka<>-1) and (dkp<>-1) then
begin
DM.Table2.Edit;
DM.Table2.FieldByName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dka+dkp;
DM.Table2.Post;
end
else
begin
if (dka=-1) and (dkp<>-1) then
begin
DM.Table2.Edit;
DM.Table2.FieldByName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dkp;
DM.Table2.Post;
end
else
begin
if (dka<>-1) and (dkp=-1) then
begin
DM.Table2.Edit;
DM.Table2.FieldbyName(floattostr(strtofloat(sd)+3)+'_s').AsFloat:=dka;
DM.Table2.Post;
end
end;
if (dka=-1) and (dkp=-1) then
so:=so+' '+DM.Table2.fieldbyname('Schet').AsString;
end;
end;
DM.Table2.Next;
end;
простите за кашу в алгоритме не спорю что он не продуман, но просто очень тяжело, во всяком случае мне, делать доработки о которых речи сначало и не шло... воти приходится изврашаться...
_vox_ (2005-02-04 13:25:00) [35]Можно попробовать изменить структуру текста - добавить пару пустых строк перед проблемным оператором или разбить оператор на несколько строк. Если отлаживать код по F8 что происходит на этом месте ??? Какие значения имеют переменные dka, dkp во время отладки на этом операторе ?
Digitman (2005-02-04 13:19:00) [36]что-то какая-тя каша страшная в алгоритме ...
esu (2005-02-04 13:18:00) [37]Есть у меня подозрение что дело где-то в этих "действие" :) Можно код целиком, начиная скажем с DM.Table2.First
Elena (2005-02-04 13:18:00) [38]ничего , просто на данном месте приостанавливает работу программы...:-(((
esu (2005-02-04 13:17:00) [39]И ни слова не пишет ? Никакой ошибки не выскакивает ?
R (2005-02-04 13:16:00) [40]Да действительно с Else begin end
все правильно.
Ну тогда трудно сказать что за прикол такой.
А останов выглядит как, я имею ввиду красное выделение строки или иное...