Форум: "Начинающим";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
ВнизПереполнение стека Найти похожие ветки
← →
Defort © (2006-11-30 17:20) [0]У меня снова проблема. В процедуре вычисления вычислимых полей у меня происходит переполнение стека. Код выглядит так:
k:=DaysBetween(datemust, datelast);
for i:=1 to k do //ê - êîëè÷åñòâî äíåé ìåæäó äàòîé ôàêòè÷åñêîé äàòû îïëàòû è äàòû îïëàòû ïî ãðàôèêó
DataModule1.ADOTable3DSDesigner3.Value{ïåíè}:=ADOTable3DSDes igner2.AsCurrency{ñóììà ïëàòåæà}+ADOTable3DSDesigner2.AsCurrency{ñóììà ïëàòåæà}*ADOTable1DSDesigner4.AsCurrency{ 4;îýôôèöèåíò ïåíè}; // Ôîðìèðîâàíèå ïîëÿ "Ïåíè": çà êàæäûé äåíü ïðñòîÿ äîáàâëÿåòñÿ ïåíè
DataModule1.ADOTable3DSDesigner5.Value{îñòàòîê ;}:=ADOTable3DSDesigner2.AsCurrency{ñóììà ïëàòåæà}+ADOTable3DSDesigner3.AsCurrency{ïåíè}-ADOTable3DSDesigner7.AsCurrency{ïîñòóïèë î îïëàòû}; // Ôîðìèðîâàíèå ïîëÿ "Îñòàòîê"
if (ADOTable3DSDesigner2.AsCurrency+ADOTable3DSDesigner3.AsCurrency)=ADOTable3DSDesigner5.AsCurrency then
ADOTable3DSDesigner4.Value:=true; //ïîãàøåí: äà
Переполнение происходит на строкеDataModule1.ADOTable3DSDesigner5.Value{îñòàòî ;ê}:=ADOTable3DSDesigner2.AsCurrency{ñóììà ïëàòåæà}+ADOTable3DSDesigner3.AsCurrency{ïåíè}-ADOTable3DSDesigner7.AsCurrency{ïîñòóïèë î îïëàòû}; // Ôîðìèðîâàíèå ïîëÿ "Îñòàòîê"
Не подскажете, в чем ошибка?
← →
Defort © (2006-11-30 17:23) [1]Что то комменты там криво отображаются, поэтому пишу что делает код:
к - количество дней между фактической датой платежа и датой по графику
Для каждого просроченного дня добавляется пени, равное сумме платежа*коэффициент пени
после этого идет формирования поля остаток: сумма платежа+сумма пени-заплачено - тут и происходит переполнение
← →
Desdechado © (2006-11-30 17:26) [2]наверняка в рекурсию ввалился
вычисление одногополя ведет к вычислению другого, а от него снова вычисляется первое
← →
Defort © (2006-11-30 21:02) [3]Кстати может быть (( А на примере моего кода непонятно, как это исправить?
← →
Джо © (2006-11-30 21:04) [4]> [3] Defort © (30.11.06 21:02)
> Кстати может быть (( А на примере моего кода непонятно,
> как это исправить?
Твой код читать невозможно, о чем ты говоришь? :)
← →
Defort © (2006-11-30 21:08) [5]
> Твой код читать невозможно, о чем ты говоришь? :)
Читать невозможно толька камменты ;) для этого я отпостил второй пост!
← →
Джо © (2006-11-30 21:23) [6]Поставь точку останова на свое строке и протрассируй.
← →
Defort © (2006-11-30 21:27) [7]
> Поставь точку останова на свое строке и протрассируй.
Делал. Там реально рекурсия. Но блин, по другому я не знаю как сделать. Я в раздумьях!
← →
Defort © (2006-11-30 23:02) [8]Попытался избавиться от рекурсии, заменив в длинном выражении всчитываемою ранее значение отдельной переменной, но все равно трабла сохранилась(
for i:=1 to k do //ê - êîëè÷åñòâî äíåé ìåæäó äàòîé ôàêòè÷åñêîé äàòû îïëàòû è äàòû îïëàòû ïî ãðàôèêó
DataModule1.ADOTable3DSDesigner3.Value{ïåíè}:=ADOTable3DSDes igner2.AsCurrency{ñóììà ïëàòåæà}+ADOTable3DSDesigner2.AsCurrency{ñóììà ïëàòåæà}*ADOTable1DSDesigner4.AsCurrency{ 4;îýôôèöèåíò ïåíè}; // Ôîðìèðîâàíèå ïîëÿ "Ïåíè": çà êàæäûé äåíü ïðñòîÿ äîáàâëÿåòñÿ ïåíè
peni:=DataModule1.ADOTable3DSDesigner3.AsCurrency;
DataModule1.ADOTable3DSDesigner5.Value{îñòàòîê ;}:=ADOTable3DSDesigner2.AsCurrency{ñóììà ïëàòåæà}+peni-ADOTable3DSDesigner7.AsCurrency{ïîñòóïèë î îïëàòû}; // Ôîðìèðîâàíèå ïîëÿ "Îñòàòîê"
if (ADOTable3DSDesigner2.AsCurrency+peni)=ADOTable3DSDesigner5.AsCurrency then
ADOTable3DSDesigner4.Value:=true; //ïîãàøåí: äà
← →
Anatoly Podgoretsky © (2006-12-01 00:43) [9]> Defort (30.11.2006 23:02:08) [8]
> //e - eiee?anoai aiae ia?ao aaoe oaeoe?aneie aaou iieaou e aau iieaou ii a?aoeeo
Что за муа?
← →
ЮЮ © (2006-12-01 05:25) [10]
DataModule1.ADOTable3DSDesigner5.Value :=
ADOTable3DSDesigner2.AsCurrency + ADOTable3DSDesigner3.AsCurrency - ADOTable3DSDesigner7.AsCurrency;
исходя из этого иожно предположить, что Designer5 вычислимое поле
тогда использование его в выражении приводит к очередному вызову обработчикаif (ADOTable3DSDesigner2.AsCurrency+ADOTable3DSDesigner3.AsCurrency) = ADOTable3DSDesigner5.AsCurrency then
ADOTable3DSDesigner4.Value:=true;
Решение:
1) заменить наif ADOTable3DSDesigner7.AsCurrency = 0 then //если Designer7 не вычислимое :)
2) вычисления хранить в промежуточных переменных:s := ADOTable3DSDesigner2.AsCurrency + ADOTable3DSDesigner3.AsCurrency - ADOTable3DSDesigner7.AsCurrency;
DataModule1.ADOTable3DSDesigner5.Value := s;
if (ADOTable3DSDesigner2.AsCurrency+ADOTable3DSDesigner3.AsCurrency) = s then
← →
Gydvin © (2006-12-01 08:56) [11][0] сохраняешь проект, юниту открываешь блокнотом, и отуда уже копируешь, тогда кАменты отображаются нормально
← →
Desdechado © (2006-12-01 11:03) [12]Gydvin © (01.12.06 08:56) [11]
Все гораздо проще - перед Ctrl-C переключиться на русскую раскладку клавы.
← →
Defort © (2006-12-01 20:16) [13]2Пипл
Посчет копирования понял, вот исходный код:
k:=DaysBetween(datemust, datelast);
for i:=1 to k do //к - количество дней между датой фактической даты оплаты и даты оплаты по графику
DataModule1.ADOTable3DSDesigner3.Value{пени}:=ADOTable3DSDesigner2.AsCurre ncy{сумма платежа}+ADOTable3DSDesigner2.AsCurrency{сумма платежа}*ADOTable1DSDesigner4.AsCurrency{коэффициент пени}; // Формирование поля "Пени": за каждый день прстоя добавляется пени
peni:=DataModule1.ADOTable3DSDesigner3.AsCurrency;
DataModule1.ADOTable3DSDesigner5.Value{остаток}:=ADOTable3DSDesigner2.AsCurrency {сумма платежа}+peni-ADOTable3DSDesigner7.AsCurrency{поступило оплаты}; // Формирование поля "Остаток"
if (ADOTable3DSDesigner2.AsCurrency+peni)=ADOTable3DSDesigner5.AsCurrency then
ADOTable3DSDesigner4.Value:=true; //погашен: да
Посчет использования промежуточных переменных - я это пытался делать. Только толку не слишком. Если честно я и сам в этих дизайнерах запутался - может что и пропустил.
← →
ЮЮ © (2006-12-02 08:47) [14]
> вот исходный код:
Исходный код, по определению, приведет к переполнению стека. См.[10]
> Посчет использования промежуточных переменных - я это пытался
> делать. Только толку не слишком.
Пока имеем от тебя только то, что имеем, а именно, код, по определению, приводящий к переполнению стека. Приведи свои попытки, тогда поверю.
← →
ЮЮ © (2006-12-02 08:56) [15]Вычислимое поле в этом обработчике можно использовать только слева в операторе присваивания. Любое другое использование приведет к необходимости его вычисления и рекурсивному вазовы этого же обработчика
DataModule1.ADOTable3DSDesigner3.Value{пени}:=ADOTable3DSDesigner2.AsCurre ncy{сумма платежа}+ADOTable3DSDesigner2.AsCurrency{сумма платежа}*ADOTable1DSDesigner4.AsCurrency{коэффициент пени}; // Формирование поля "Пени": за каждый день прстоя добавляется пени
peni:=DataModule1.ADOTable3DSDesigner3.AsCurrency;
DataModule1.ADOTable3DSDesigner5.Value{остаток}:=ADOTable3DSDesigner2.AsCurrency {сумма платежа}+peni-ADOTable3DSDesigner7.AsCurrency{поступило оплаты}; // Формирование поля "Остаток"
if (ADOTable3DSDesigner2.AsCurrency+peni)=ADOTable3DSDesigner5.AsCurrency then
ADOTable3DSDesigner4.Value:=true; //погашен: да
сначала посчитай peni, а потом присваивай полю
аналогично с плем ADOTable3DSDesigner5.AsCurrency
← →
Defort © (2006-12-02 16:13) [16]
> Приведи свои попытки, тогда поверю.
>
Ок. Ниже кодprocedure TDataModule1.ADOTable3CalcFields(DataSet: TDataSet);
var datelast, datemust: TDateTime;
i, k: word; //счетчик
peni, ending{остаток}: real;
begin
datelast:=DataModule1.ADOTable3DSDesigner8.AsDateTime;
datemust:=DataModule1.ADOTable3DSDesigner.AsDateTime;
if datelast=NULL then datelast:=now;
k:=DaysBetween(datelast, datemust);
for i:=1 to k do //к - количество дней между датой фактической даты оплаты и даты оплаты по графику
peni{пени}:=ADOTable3DSDesigner2.AsCurrency{сумма платежа}+ADOTable3DSDesigner2.AsCurrency{сумма платежа}*ADOTable1DSDesigner4.AsCurrency{коэффициент пени}; // Формирование поля "Пени": за каждый день прстоя добавляется пени
DataModule1.ADOTable3DSDesigner3.Value:=peni;
ending{остаток}:=ADOTable3DSDesigner2.AsCurrency{сумма платежа}+peni-ADOTable3DSDesigner7.AsCurrency{поступило оплаты}; // Формирование поля "Остаток"
DataModule1.ADOTable3DSDesigner5.Value:=ending;
if (ADOTable3DSDesigner2.AsCurrency+peni)=ending then
ADOTable3DSDesigner4.Value:=true; //погашен: да
end;
Я трассировал, у меня процедура выполняется по кругу. (это ведб и есть рекурсия).
Да, и еще проблема: в цикл for программа не входит. видимо я снова перемудрил что то с датами. Может ктонить прочекатЬ?
← →
Defort © (2006-12-02 20:08) [17]Пипол! Чево молчите все? (
← →
Anatoly Podgoretsky © (2006-12-02 20:27) [18]> Defort (02.12.2006 20:08:17) [17]
Пипол за углом водку пьет, а здесь программисты
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c