Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.044 c
4-1128591108
Symbol
2005-10-06 13:31
2005.12.11
Ввод со звуковой карты


6-1125308417
Irinka
2005-08-29 13:40
2005.12.11
Пересылка и получение файлов с помощью сокетов


2-1132844658
worldmen
2005-11-24 18:04
2005.12.11
BIOS.


2-1132570964
Apachi
2005-11-21 14:02
2005.12.11
TWebBrowser как прочитать содержимое


2-1133113159
Neosted
2005-11-27 20:39
2005.12.11
EXE файл