![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер стека
Alex_Korn © (2005-10-11 14:21:00)Как определить какую часть стековой памяти
занимает программа в данный момент времени ?
Digitman (2005-10-12 18:13:00) [1]
> Alex_Korn © (12.10.05 16:19) [21]
> Давайте лучше поговорим о стеке
а что о нем говорить ?
стек - он и в Африке стек.
ты вообще-то представляешь себе, как стек используется при рекурсии ?
да и не только при рекурсии - просто при обычном вызове п/программы с параметрами ? с учетом заданного соглашения о вызове ?
Leonid Troyanovsky (2005-10-12 17:58:00) [2]
> Alex_Korn © (12.10.05 17:45) [23]
> >Что, нельзя вычислить значения Slots для произвольного
> Step?
> Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-
> ой.
Рекурсия была бы (почти) неизбежна если б было наоборот, т.е.,
нельзя бы было обработать 36 без обработки 50-ой.
А так, у тебя, все равно, ведется список Slots, при необходимости
хранения всей предыстории можно задействовать и его Objects.
--
Regards, LVT.
MBo (2005-10-12 17:50:00) [3]>Alex_Korn © (12.10.05 17:45) [23]
Это не противоречит обыкновенному циклу
Alex_Korn (2005-10-12 17:45:00) [4]>Что, нельзя вычислить значения Slots для произвольного Step?
Карты в устройство подаются поочередно.
Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-ой.
А Slots зависит от этих данных.
Leonid Troyanovsky (2005-10-12 17:08:00) [5]
> Alex_Korn © (12.10.05 15:02) [16]
> Нельзя
Бездоказательно.
--
Regards, LVT.
Alex_Korn (2005-10-12 16:19:00) [6]Digitman © (12.10.05 15:32) [20]
С процедурой я разберусь.
Давайте лучше поговорим о стеке :))
Digitman (2005-10-12 15:32:00) [7]малацца.
Alex_Korn (2005-10-12 15:26:00) [8]Digitman © (12.10.05 15:13) [18]
Убрал
Digitman (2005-10-12 15:13:00) [9]по крайней мере ЭТУ ( см. [13]) убери.
уж это лажа из лаж ... что там уж о стеке разглагольствовать ..
Alex_Korn (2005-10-12 15:07:00) [10]P.S. Сделал ее процедурой
Alex_Korn (2005-10-12 15:02:00) [11]Leonid Troyanovsky © (12.10.05 14:32) [14]
Нельзя
>Digitman
Процедура в процессе разработки.
Рассматриваются различные варианты, поэтому "лаж" в ней
предостаточно.
Digitman (2005-10-12 14:38:00) [12]короче, алгоритм - "фтопку".
после того как будет нормально продуманный рек.алгоритм будут и рассуждалки про стек.
Leonid Troyanovsky (2005-10-12 14:32:00) [13]
> Alex_Korn © (12.10.05 14:13) [12]
> Подробности ничего не дадут, тут весь проект приводить надо:
> ((
> function ModuleWorkStepRec(Module:TModule; Laser:TLaserMarker;
> var OldCardNum:string; var Step:integer; Slots:TStringList):
> Boolean;
Вот я не понял, а чем while ModuleWorkStepRec() do ; не гоже?
Что, нельзя вычислить значения Slots для произвольного Step?
--
Regards, LVT
Digitman (2005-10-12 14:23:00) [14]
> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);
ну и какие там рассуждения о стеках, когда вот здесь
> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);
явная ЛАЖА ?
с какого перепугу здесьп/программа ModuleWorkStepRec() вызывается как процедура, в то время как для рекурсии важен ее вызов как ФУНКЦИИ и столь же важен результат, ею возвращаемый ?!
давай исправляй уже лажу... потом и в рассуждалки про стек будем играть)
Alex_Korn (2005-10-12 14:13:00) [15]Подробности ничего не дадут, тут весь проект приводить надо:((
function ModuleWorkStepRec(Module:TModule; Laser:TLaserMarker; var OldCardNum:string; var Step:integer; Slots:TStringList):Boolean;
var
Err:TError;
MarkErr:Boolean;
ErrArr: array[0..4] of TError;
CardNum,ICCID,PIN1,PIN2,PUK1,PUK2:string;
begin
Result:=False;
MarkErr:=False;
inc(Step);
SendFrameText(Module.ModuleNumb,PChar('Идет подача карты'));
if not Module.FeedCards(False,ErrArr) then
begin
if ErrArr[0].ErrCode>0 then ErrArr[0].ErrCode:=erFatalError;
IsContinue:=ErrCodeReaction(ErrArr[0],'FeedCards','Карта не поступила в конвейер');
end;
SendFrameText(Module.ModuleNumb,PChar('Идет маркировка карты'));
Err:=Laser.Mark(Slots);
Slots.Clear;
if Err.ErrCode>0 then
begin
MarkErr:=True;
Err.ErrCode:=erMediumError;
ErrCodeReaction(Err,'Laser.Mark',OldCardNum,'Ошибка маркировки карты');
end;
if not IsLastCard(OldCardNum) then
begin
SendFrameText(Module.ModuleNumb,PChar('Идет формирование слота.'));
if SetResult(CardNum,GetCardNumber(Module.Channels[ChnlInd]),'') then
try
ICCID:=GetValue(PChar(CardNum),'ICCID');
PIN1:=GetValue(PChar(CardNum),'PIN1');
PIN2:=GetValue(PChar(CardNum),'PIN2');
PUK1:=GetValue(PChar(CardNum),'PUK1');
PUK2:=GetValue(PChar(CardNum),'PUK2');
if (ICCID='') or (PIN1='') or (PIN2='') or (PUK1='') or (PUK2='') then
begin
WriteMsg(LastError);
SendFrameText(ModInd,PChar('Ошибка получения параметров из SlotFile'));
SendFrameMess(ALX_FRAME_BASE,ModInd,ErrCodeToMess(erFatalError),integer(PChar(CreateDelimStr(['Шаг'+gapIs+IntToStr(Curr_ Step),'GetValue',ICCID,IntToStr(erFatalError),LastError,'Ошибка получения параметров из SlotFile'],Dlm))));
IsContinue:=False;
end
else Result:=CreateSlotsList(ICCID,PIN1,PIN2,PUK1,PUK2,Slots);
if not Result then
begin
Err.ErrCode:=erWarning;
Err.ErrString:='Слот лист пуст';
ErrCodeReaction(Err,'CreateSlotsList',ICCID,'Ошибка в формировании слота');
end;
finally
end;
end;
if not MarkErr then
begin
SendFrameText(Module.ModuleNumb,PChar('Ожидание конца маркировки карты.'));
Err:=Laser.WaitForMarkEnd;
if Err.ErrCode>0 then Err.ErrCode:=erMediumError;
ErrCodeReaction(Err,'WaitForMarkEnd',OldCardNum,'Ошибка окончания маркировки карты');
end;
if Err.ErrCode=0 then SendFrameInfo(ModInd,PChar(CreateDelimStr(['Шаг'+gapIs+IntToStr(Curr_Step),'WaitForMarkEnd',OldCardNum,IntToStr(Err.ErrC ode),Err.ErrString,'Конец маркировки карты'],Dlm)));
SendFrameText(Module.ModuleNumb,PChar('Идет запись результата маркировки в БД.'));
if not Write_ResultToDB(PChar(OldCardNum),Err.ErrCode,PChar(Err.ErrString)) then
begin
WriteMsg(LastError);
SendFrameMess(ALX_FRAME_BASE,ModInd,MODULE_WRITE_DB_ERR,integer(PChar(CreateDelimStr(['Шаг'+gapIs+IntToStr(Curr_Step),'W riteResultToDB',OldCardNum,IntToStr(erFatalError),LastError,'Ошибка записи результата в БД'],Dlm))));
Exit;
end;
if IsLastCard(ICCID) then
begin
Result:=True;
SendFrameText(Module.ModuleNumb,PChar('Процесс маркировки карт завершен.'));
SetFrameColor(ALX_FRAME_BASE,Module.ModuleNumb,MODULE_SET_COLOR,clLime);
Exit;
end;
if Result and IsContinue then ModuleWorkStepRec(Module,Laser,ICCID,Step,Slots);
end;
MBo (2005-10-12 12:47:00) [16]>Alex_Korn
Зря ты не хочешь подробности задачи раскрыть.
Не исключено, что найдется более эффективное решение.
Digitman (2005-10-12 11:41:00) [17]
> Допустим получаю, что занял 90% от "Stack overload"
> и останавливаю рекурсию
А с чего ты взял, что очередная итерация рекурсивного цикла уже не уместится в оставшиеся 10% стека и поэтому пора выходить из рек.цикла ?
Для этого тебе нужно знать стековые ресурсы для одной отдельно взятой итерации, что в языках высокого уровня знать, мягко говоря, невозможно.
К тому же стек не имеет фикссированного (на всем протяжении работы программы) размера - в ходе работы процесса он может по необходимости расти в пределах от min до max
Alex_Korn (2005-10-12 11:28:00) [18]Digitman © (12.10.05 11:04) [8]
Допустим получаю, что занял 90% от "Stack overload"
и останавливаю рекурсию, допустим глобальной переменной или
напрямую, перед рекурсивным вызовом запрашиваю свое местонахождение.
Digitman (2005-10-12 11:04:00) [19]
> Alex_Korn © (12.10.05 10:22) [7]
Любопытно, как ты вознамерился оценивать это самое "как далеко" ...
т.е. любопытно то самое условие выхода из рекурсивного цикла на случай "близости конца", которое ты предполагаешь ввести у себя в алгоритме ...
Alex_Korn (2005-10-12 10:22:00) [20]Leonid Troyanovsky © (12.10.05 9:43) [6]
Меня интересует как далеко я нахожусь от такой
загрузки стека, когда наступит "Stack overload".