Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизРазмер стека Найти похожие ветки
← →
Alex_Korn © (2005-10-11 14:21) [0]Как определить какую часть стековой памяти
занимает программа в данный момент времени ?
← →
Digitman © (2005-10-11 14:42) [1]хм... непонятно что тебя интересует ...
попробую протелепатировать :
procedure TForm1.Button3Click(Sender: TObject);
var
p: Pointer;
mbi: TMemorybasicInformation;
begin
asm
mov p, esp;
end;
VirtualQuery(pointer(findhinstance(p)), mbi, sizeof(mbi));
showmessage(inttohex(mbi.RegionSize, 8));
end;
← →
Alex_Korn © (2005-10-12 07:35) [2]Digitman © (11.10.05 14:42) [1]
Спасибо !
Я имел ввиду следующее:
Бывает ошибка - "Stack overload".
Я в программе использую рекурсию и меня интересует вопрос
сколько процентов стека я занял на данный момент от "Stack overload".
← →
MBo © (2005-10-12 07:53) [3]>Я в программе использую рекурсию и меня интересует вопрос
Такие проблемы решаются тщательным планированием алгоритма с целью (разумного) ограничения рекурсии. Во многих случаях от нее вообще можно избавиться.
← →
Alex_Korn © (2005-10-12 09:04) [4]MBo © (12.10.05 7:53) [3]
Рекурсия у меня ограничена количеством элементов, которые надо
обработать. Их ( элементов ) фиксированное число, имеющее
верхнюю границу.
Отказываться от рекурсии, в моем случае, нецелесообразно.
← →
MBo © (2005-10-12 09:08) [5]Что за алгоритм?
← →
Leonid Troyanovsky © (2005-10-12 09:43) [6]
> Alex_Korn © (12.10.05 07:35) [2]
> Я в программе использую рекурсию и меня интересует вопрос
> сколько процентов стека я занял на данный момент от "Stack
> overload".
В тот момент, когда появляется Stack overflow поздно считать проценты,
бо все, что можно было выделить потоку было выделено (стек растет
динамически, по мере необходимости).
Самая распространенная причина - ошибка в рекурсивных функциях,
от коих и следует тщательнейшим образом избавляться (ничего
сверхестественного для этого не требуется).
--
Regards, LVT.
← →
Alex_Korn © (2005-10-12 10:22) [7]Leonid Troyanovsky © (12.10.05 9:43) [6]
Меня интересует как далеко я нахожусь от такой
загрузки стека, когда наступит "Stack overload".
← →
Digitman © (2005-10-12 11:04) [8]
> Alex_Korn © (12.10.05 10:22) [7]
Любопытно, как ты вознамерился оценивать это самое "как далеко" ...
т.е. любопытно то самое условие выхода из рекурсивного цикла на случай "близости конца", которое ты предполагаешь ввести у себя в алгоритме ...
← →
Alex_Korn © (2005-10-12 11:28) [9]Digitman © (12.10.05 11:04) [8]
Допустим получаю, что занял 90% от "Stack overload"
и останавливаю рекурсию, допустим глобальной переменной или
напрямую, перед рекурсивным вызовом запрашиваю свое местонахождение.
← →
Digitman © (2005-10-12 11:41) [10]
> Допустим получаю, что занял 90% от "Stack overload"
> и останавливаю рекурсию
А с чего ты взял, что очередная итерация рекурсивного цикла уже не уместится в оставшиеся 10% стека и поэтому пора выходить из рек.цикла ?
Для этого тебе нужно знать стековые ресурсы для одной отдельно взятой итерации, что в языках высокого уровня знать, мягко говоря, невозможно.
К тому же стек не имеет фикссированного (на всем протяжении работы программы) размера - в ходе работы процесса он может по необходимости расти в пределах от min до max
← →
MBo © (2005-10-12 12:47) [11]>Alex_Korn
Зря ты не хочешь подробности задачи раскрыть.
Не исключено, что найдется более эффективное решение.
← →
Alex_Korn © (2005-10-12 14:13) [12]Подробности ничего не дадут, тут весь проект приводить надо:((
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;
← →
Digitman © (2005-10-12 14:23) [13]
> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);
ну и какие там рассуждения о стеках, когда вот здесь
> if Result and IsContinue then ModuleWorkStepRec(Module,Laser,
> ICCID,Step,Slots);
явная ЛАЖА ?
с какого перепугу здесь п/программа ModuleWorkStepRec() вызывается как процедура, в то время как для рекурсии важен ее вызов как ФУНКЦИИ и столь же важен результат, ею возвращаемый ?!
давай исправляй уже лажу... потом и в рассуждалки про стек будем играть)
← →
Leonid Troyanovsky © (2005-10-12 14:32) [14]
> 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:38) [15]короче, алгоритм - "фтопку".
после того как будет нормально продуманный рек.алгоритм будут и рассуждалки про стек.
← →
Alex_Korn © (2005-10-12 15:02) [16]Leonid Troyanovsky © (12.10.05 14:32) [14]
Нельзя
>Digitman
Процедура в процессе разработки.
Рассматриваются различные варианты, поэтому "лаж" в ней
предостаточно.
← →
Alex_Korn © (2005-10-12 15:07) [17]P.S. Сделал ее процедурой
← →
Digitman © (2005-10-12 15:13) [18]по крайней мере ЭТУ ( см. [13]) убери.
уж это лажа из лаж ... что там уж о стеке разглагольствовать ..
← →
Alex_Korn © (2005-10-12 15:26) [19]Digitman © (12.10.05 15:13) [18]
Убрал
← →
Digitman © (2005-10-12 15:32) [20]малацца.
← →
Alex_Korn © (2005-10-12 16:19) [21]Digitman © (12.10.05 15:32) [20]
С процедурой я разберусь.
Давайте лучше поговорим о стеке :))
← →
Leonid Troyanovsky © (2005-10-12 17:08) [22]
> Alex_Korn © (12.10.05 15:02) [16]
> Нельзя
Бездоказательно.
--
Regards, LVT.
← →
Alex_Korn © (2005-10-12 17:45) [23]>Что, нельзя вычислить значения Slots для произвольного Step?
Карты в устройство подаются поочередно.
Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-ой.
А Slots зависит от этих данных.
← →
MBo © (2005-10-12 17:50) [24]>Alex_Korn © (12.10.05 17:45) [23]
Это не противоречит обыкновенному циклу
← →
Leonid Troyanovsky © (2005-10-12 17:58) [25]
> Alex_Korn © (12.10.05 17:45) [23]
> >Что, нельзя вычислить значения Slots для произвольного
> Step?
> Не обраотав 36-ю, я не могу считать данные с 38-ой или 50-
> ой.
Рекурсия была бы (почти) неизбежна если б было наоборот, т.е.,
нельзя бы было обработать 36 без обработки 50-ой.
А так, у тебя, все равно, ведется список Slots, при необходимости
хранения всей предыстории можно задействовать и его Objects.
--
Regards, LVT.
← →
Digitman © (2005-10-12 18:13) [26]
> Alex_Korn © (12.10.05 16:19) [21]
> Давайте лучше поговорим о стеке
а что о нем говорить ?
стек - он и в Африке стек.
ты вообще-то представляешь себе, как стек используется при рекурсии ?
да и не только при рекурсии - просто при обычном вызове п/программы с параметрами ? с учетом заданного соглашения о вызове ?
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.037 c