Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер стека


Страницы:   1 2

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".


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо