Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.04.2009, 04:31   #1
Андрей Куб
Пользователь
 
Регистрация: 13.05.2008
Сообщений: 12
По умолчанию не могу найти почему вылетает прога

Добрый день, если кто знает в чём ошибка plz хелп
при многократном спаме кнопки
procedure TForm5.Button1Click..........; программа вылетает с ошибкой стак оверфлор.

Вот листинг касячного модуля,а архиве исходники , в самой проге Моделирование-Лаб.Раб. 4 <

Код:
unit Unit5;
.........................
Var
  Ochered:array of chelovek;

implementation

uses unit6;

{$R *.dfm}


Function FormMytime(a:integer):string;
begin
result:='';

if a=0 then result:='-';
if (a<=60) and (a<>0) then result:=inttostr(a)+' с.';
if (a>60) and (a<3600) then result:=inttostr(a div 60)+' м.'+inttostr(a - (a div 60)*60)+ 'с.';
if (a>3600) then result:=inttostr(a div 3600)+' ч.'+ inttostr((a - (a div 3600)*3600) div 60)+ 'м.' + inttostr(a-(a div 3600)*3600-60*((a - (a div 3600)*3600) div 60))+ 'с.';

end;


procedure KtoPoslednii(x:integer;Var Rez1,Rez2:integer);
var
y:integer;
e:boolean;
begin
rez1:=0;
rez2:=0;
y:=x-1;
e:=false;
while (y>-1) and (e=false) do begin
if ochered[x][10]<ochered[y][10]+ochered[y][9] then begin rez1:=rez1+1;
Rez2:=rez2+ochered[y][9]-(ochered[y+1][10]-ochered[y][10]) end else e:=true;
inc(y,-1);
end;
end;

Procedure Generate;
var
x,time1,t,IntervalFrom,IntervalTo,ZaprosFrom,ZaprosTo,PrintZFrom,PrintZTo,
Search,ChooseFrom,ChooseTo,PrintFrom,PrintTo,accurFrom,accurTo,
BookFrom,BookTo,IntervalZFrom,IntervalZTo,SpeczFrom,SpeczTo:integer;
begin

randomize;

with form5 do begin
//////////////////////////////////////////////////////////////////////////////
time1:=strtoint(labelededit1.Text);
FromTo(maskedit1.Text,IntervalFrom,IntervalTo);
FromTo(maskedit2.Text,ZaprosFrom,ZaprosTo);
FromTo(maskedit3.Text,PrintZFrom,PrintZTo);
Search:=Strtoint(maskedit4.Text);
FromTo(maskedit5.Text,ChooseFrom,ChooseTo);
FromTo(maskedit6.Text,PrintFrom,PrintTo);
FromTo(maskedit7.Text,accurFrom,accurTo);
FromTo(maskedit8.Text,BookFrom,BookTo);
FromTo(maskedit9.Text,IntervalzFrom,IntervalzTo);
FromTo(maskedit10.Text,SpeczFrom,SpeczTo);
end;
//////////////////////////////////////////////////////////////////////////////
setlength(ochered,time1);

x:=0;t:=0;
While (x<time1)  do begin
ochered[t][1]:=RandomRange(IntervalFrom,IntervalTo);
ochered[t][2]:=RandomRange(ZaprosFrom,ZaprosTo);
ochered[t][3]:=RandomRange(PrintZFrom,PrintZTo);
ochered[t][4]:=Search;
ochered[t][5]:=RandomRange(ChooseFrom,ChooseTo);
ochered[t][6]:=RandomRange(PrintFrom,PrintTo);
ochered[t][7]:=RandomRange(accurFrom,accurTo);
ochered[t][8]:=RandomRange(BookFrom,BookTo);
/////////////////////Общее время облуживание у оператора/////////////////////
ochered[t][9]:=ochered[t][2]+ochered[t][3]+ochered[t][4]+ochered[t][5]+
ochered[t][6]+ochered[t][7];
/////////////////////Общее время облуживание у оператора/////////////////////
x:=x+ochered[t][1];
inc(t);

if x>=strtoint(form5.labelededit10.text) then begin
if randomrange(-1,2)=1 then  begin
ochered[t][1]:=RandomRange(IntervalZFrom,IntervalZTo);
ochered[t][2]:=RandomRange(SpeczFrom,SpeczTo);
ochered[t][8]:=RandomRange(BookFrom,BookTo);
ochered[t][20]:=randomrange(0,4);
KtoPoslednii(t,ochered[x][11],ochered[x][12]);
if (ochered[t][20]=0) then ochered[t][20]:=randomrange(1,3);
ochered[t][3]:=0;
ochered[t][4]:=0;
ochered[t][5]:=0;
ochered[t][6]:=0;
ochered[t][7]:=0;
if randomrange(-1,2)=0 then  begin
ochered[t][2]:=RandomRange(ZaprosFrom,ZaprosTo);
ochered[t][3]:=RandomRange(PrintZFrom,PrintZTo);
ochered[t][4]:=Search;
ochered[t][5]:=RandomRange(ChooseFrom,ChooseTo);
ochered[t][6]:=RandomRange(PrintFrom,PrintTo);
ochered[t][7]:=RandomRange(accurFrom,accurTo);
/////////////////////Общее время облуживание у оператора/////////////////////
ochered[t][9]:=ochered[t][2]+ochered[t][3]+ochered[t][4]+ochered[t][5]+
ochered[t][6]+ochered[t][7];
/////////////////////Общее время облуживание у оператора/////////////////////
end;
inc(t)
end;
//if ochered[t][1]<ochered[t-1][1] then swap1(ochered[t],ochered[t-1]);
end;
end;
setlength(Ochered,t);


//////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////
ochered[0][10]:=ochered[0][1];
for x := 1 to t do begin
ochered[x][10]:=ochered[x-1][10]+ochered[x][1];  //Перевод времени
KtoPoslednii(x,ochered[x][11],ochered[x][12]);  //Сколько человек в очереди до Него  //Сколько ждать до обслуживания
end;

while ochered[length(ochered)][10]>36000 do setlength(Ochered,length(ochered)-1);


end;
//////////////////////////////////////////////////////////////////////////////



procedure TForm5.Button1Click(Sender: TObject);

begin
Generate;
Print1;


end;

end.
Весь юнит не вместился, пришлось половину обрезать(

форумная заливался не работает, залил архив сюда
http://www.sharemania.ru/files/manag...Owc0hOzZMSqSja
Андрей Куб вне форума
Старый 25.04.2009, 05:09   #2
qpokyc
Форумчанин
 
Аватар для qpokyc
 
Регистрация: 07.04.2009
Сообщений: 117
По умолчанию

У меня Delphi вообще при загрузке проекта выдала I\O error и сдохла...
Значит stack overflow? Это бывает по двум причинам:
1) Слишком большая вложенность подпрограмм (особенно методов)
2) Большое число входных параметров у функций + первое

Решения:
1) Оптимизировать программу (незнаю как влияют на стэк локальные переменные, но ты бы чтоли в массиве или структуре хранил такое число значений и передавал бы по сцылке).
2) Подтянуть стэк до нужного уровня (что не есть хорошо, и если по хорошему - то это плохо, но удобно). Делается это в ProjectOptions\Linker\MemorySizzes
3) Читать это невыносимо, но посмотри - может быть ты объекты создаешь и не уничтожаешь?

А вообще, "как правильно оформлять код" учат, обычно, раньше чем ООП.
Copyright © qpokyc (qpy[the dog]bk.ru), 2008-2009 г.

Последний раз редактировалось qpokyc; 25.04.2009 в 05:15.
qpokyc вне форума
Старый 25.04.2009, 05:49   #3
Андрей Куб
Пользователь
 
Регистрация: 13.05.2008
Сообщений: 12
По умолчанию

я уж извиняюсь но где ты нашел большое число ВХОДНЫХ параметров у функций?
Стэк стоик максимально возможный.
1) Времена когда память переполнялась из-за 20 локальных переменных прошли лет 20 назад уже =)
2)Про стек я уже сказал
3)Никаких объектов я не создаю, а переменные все обнуляются;

код написал на код гире 2009 возможно по этому ты не смог его открыть.

Про насмешку про то "как правильно оформлять код" я промолчу, но если вам по делу сказать было нечего не стоило ничего отвечать
Андрей Куб вне форума
Старый 25.04.2009, 07:27   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Память надо чистить.
Код:
...
  ochered := nil;
  setlength(ochered,36000);
...
  ochered := nil; //а здесь тем более, раз перестраиваем динамический массив
  setlength(Ochered,t);
...
Не очень понятно зачем здесь тыкать в кнопку десять раз. При этом все равно появляется ошибка (это после упомянутого исправления), но уже при закрытии программы, и которую я уже отловить не смог (лениво).
Ежели (для теста) ткнуть пару-тройку раз, то никаких ошибок не появляется.
Скандербег вне форума
Старый 25.04.2009, 13:55   #5
Андрей Куб
Пользователь
 
Регистрация: 13.05.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Скандербег Посмотреть сообщение
Память надо чистить.
Код:
...
  ochered := nil;
  setlength(ochered,36000);
...
  ochered := nil; //а здесь тем более, раз перестраиваем динамический массив
  setlength(Ochered,t);
...
Не очень понятно зачем здесь тыкать в кнопку десять раз. При этом все равно появляется ошибка (это после упомянутого исправления), но уже при закрытии программы, и которую я уже отловить не смог (лениво).
Ежели (для теста) ткнуть пару-тройку раз, то никаких ошибок не появляется.

Цитата:
ochered := nil; //а здесь тем более, раз перестраиваем динамический массив
setlength(Ochered,t);

Вы такой классный, советуете почистить результирующий массив?

Цитата:
Не очень понятно зачем здесь тыкать в кнопку десять раз.
А лучше вообще не исправлять ошибки в своих программах,правда?

А тыркать кнопку 10 раз нужно хотябы потому что 10 раз могут меняться начальные данные, и что теперь прогу перезагружать если хочешь промоделировать заново?

Вот листинг косячного кода, но я не могу понять в чем касяк

Код:
{if x>=strtoint(form5.labelededit10.text) then begin
if randomrange(-1,2)=1 then  begin
ochered[t][1]:=RandomRange(IntervalZFrom,IntervalZTo);
ochered[t][2]:=RandomRange(SpeczFrom,SpeczTo);
ochered[t][8]:=RandomRange(BookFrom,BookTo);
ochered[t][20]:=randomrange(0,4);
KtoPoslednii(t,ochered[x][11],ochered[x][12]);
if (ochered[t][20]=0) then ochered[t][20]:=randomrange(1,3);
ochered[t][3]:=0;
ochered[t][4]:=0;
ochered[t][5]:=0;
ochered[t][6]:=0;
ochered[t][7]:=0;
if randomrange(-1,2)=0 then  begin
ochered[t][2]:=RandomRange(ZaprosFrom,ZaprosTo);
ochered[t][3]:=RandomRange(PrintZFrom,PrintZTo);
ochered[t][4]:=Search;
ochered[t][5]:=RandomRange(ChooseFrom,ChooseTo);
ochered[t][6]:=RandomRange(PrintFrom,PrintTo);
ochered[t][7]:=RandomRange(accurFrom,accurTo);
/////////////////////Общее время облуживание у оператора/////////////////////
ochered[t][9]:=ochered[t][2]+ochered[t][3]+ochered[t][4]+ochered[t][5]+
ochered[t][6]+ochered[t][7];
/////////////////////Общее время облуживание у оператора/////////////////////
end;
t:=t+1;
end;
//if ochered[t][1]<ochered[t-1][1] then swap1(ochered[t],ochered[t-1]);
end;   }


и


Код:
{for x := 1 to t do begin
ochered[x][10]:=ochered[x-1][10]+ochered[x][1];  //Перевод времени
KtoPoslednii(x,ochered[x][11],ochered[x][12]);  //Сколько человек в очереди до Него  //Сколько ждать до обслуживания
end;

while ochered[length(ochered)][10]>36000 do setlength(Ochered,length(ochered)-1);
если это 2 куска кода убрать работает идеально.

нашел ошибку

Код:
if x>=strtoint(form5.labelededit10.text) then begin
if randomrange(-1,2)=1 then  begin
ochered[t][1]:=RandomRange(IntervalZFrom,IntervalZTo);
ochered[t][2]:=RandomRange(SpeczFrom,SpeczTo);
ochered[t][8]:=RandomRange(BookFrom,BookTo);
ochered[t][20]:=randomrange(1,4);
//KtoPoslednii(t,ochered[x][11],ochered[x][12]);<<<<<Вот ошибка
ochered[t][3]:=0;
ochered[t][4]:=0;
ochered[t][5]:=0;
ochered[t][6]:=0;
ochered[t][7]:=0;
if randomrange(-1,2)=0 then  begin
но всё равно иногда вылетает

Последний раз редактировалось Stilet; 27.04.2009 в 10:19.
Андрей Куб вне форума
Старый 25.04.2009, 15:08   #6
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Здесь как-то не очень четко контролируется переменная t. Возможно она выходит за допустимые пределы, точнее она превышает размер массива ochered, ведь везде используется ochered[t][...] и при этом в цикле While (x<time1) do с переменной time1 сравнивается не t, а x.

Последний раз редактировалось Jeni; 25.04.2009 в 15:11.
Jeni вне форума
Старый 25.04.2009, 15:14   #7
Андрей Куб
Пользователь
 
Регистрация: 13.05.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
Здесь как-то не очень четко контролируется переменная t. Возможно она выходит за допустимые пределы, точнее она превышает размер массива ochered, ведь везде используется ochered[t][...] и при этом в цикле While (x<time1) do с переменной time1 сравнивается не t, а x.
Перед выполнением этого цикла стоит
Код:
setlength(ochered,time1);
что как минимум в 10 раз больше чем максимально возможное значение t

Цитата:
Сообщение от Андрей Куб Посмотреть сообщение
Перед выполнением этого цикла стоит
Код:
setlength(ochered,time1);
что как минимум в 10 раз больше чем максимально возможное значение t
Я объясню задачу :
Я моделирую рабочий день библиотеки,X это, если не вдаваясь в детали, текущее время, time1 это время рабочего деня, a t это счётчик который увеличивается каждый раз когда приходит читатель с заданным интервалом.

Последний раз редактировалось Stilet; 27.04.2009 в 10:19.
Андрей Куб вне форума
Старый 25.04.2009, 15:24   #8
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Больше всего непонятно следующее: массив ochered объявляется как одномерный setlength(ochered,time1), а используется как двумерный ochered[t][1]
Jeni вне форума
Старый 25.04.2009, 15:40   #9
Андрей Куб
Пользователь
 
Регистрация: 13.05.2008
Сообщений: 12
По умолчанию

Мда...

type
Chelovek=array[1..20] of integer;
.......
var
Ochered:array of chelovek;

надеюсь я для вас Америку не открыл.
Андрей Куб вне форума
Старый 25.04.2009, 15:47   #10
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от Андрей Куб Посмотреть сообщение
type
Chelovek=array[1..20] of integer;
Ну и где это было показано в коде в первом сообщении?
Jeni вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять почему вылетает 3 процедурка, помогите Taisja Помощь студентам 2 04.06.2008 21:28
прога пишет ошибку при открытии файла (почему?) nicky777 Общие вопросы Delphi 2 14.03.2008 17:56
Есть готовая прога но запароленная, не могу запустить! Алёна Общие вопросы Delphi 4 29.10.2007 10:41