Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с завершением приложения

1.8K
05 апреля 2006 года
kvadro
35 / / 17.06.2005
Доброг времени суток.
Свалился на голову курсач там задача с динамическим программированием.
Использовал динамические массивы разумеется.
Всё вобщем то работает,но при закрытии формы выдаётся ошибка что то вроде ошибки обращения по адресу и т.д.
Проблема в том что с Dilphi я как то не очень знаком и представить не могу что надо исправить.
Единственное до чего додумался это обнулить массивы перед выходом из приложения естественно не помогло.
Кто нибудь может предположить что у меня ещё нетак?
Могу скинуть листинг но в нём без подготовки вряд ли разберешься.
+При добавлении на форму кнопки (одна там уже есть) приложение вобще вылетает тоже что то там про ошибку адресов.
5
05 апреля 2006 года
hardcase
4.5K / / 09.08.2005
Код в студию!
1.8K
06 апреля 2006 года
kvadro
35 / / 17.06.2005
Цитата:
Originally posted by hardcase
Код в студию!


unit kurs;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ValEdit, StdCtrls, ExtCtrls, ComCtrls, ActnList, Spin;

type
dnt=Array of Array of Integer;
dnt2=Array of Single;
TBeginin = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Koldays: TSpinEdit;
d1: TSpinEdit;
d2: TSpinEdit;
d3: TSpinEdit;
d4: TSpinEdit;
d5: TSpinEdit;
d6: TSpinEdit;
d7: TSpinEdit;
dl1: TLabel;
d8: TSpinEdit;
dl2: TLabel;
dl3: TLabel;
dl4: TLabel;
dl5: TLabel;
dl6: TLabel;
dl7: TLabel;
dl8: TLabel;
Memo1: TMemo;
ok: TButton;
Stoimxran: TSpinEdit;
Label5: TLabel;
Label6: TLabel;
Stproizv: TSpinEdit;
Label7: TLabel;
zapstan: TSpinEdit;
procedure FormCreate(Sender: TObject);
procedure okClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Beginin: TBeginin;
days: Word;
std,zap,stx:Word;
minind,sm,predvar,kolvar,chsd,chsv,l,tekd,tdps,k,z,z1,zav,i,j,y:Integer;
summ,dn:dnt;
sn:dnt2;
dm:Array[1..10] of Word;
implementation

{$R *.dfm}

procedure TBeginin.FormCreate(Sender: TObject);
begin
{dl3.Caption:='';
dl4.Caption:='';
dl5.Caption:='';
dl6.Caption:='';
dl7.Caption:='';
dl8.Caption:='';}
{d3.Visible:=false;
d4.Visible:=false;
d5.Visible:=false;
d6.Visible:=false;
d7.Visible:=false;
d8.Visible:=false;}
end;

procedure vetka(var dn1:dnt; otk:Integer);
Begin
z:=otk;
z1:=zav;
For k:=1 to tdps do
Begin
dn1[chsd,z1]:=dn1[chsd-1,z];
dn1[chsd,z1+1]:=dn1[chsd-1,z+1];
z:=z+2;
z1:=z1+2;
End;
zav:=z1-1;
dn1[chsd,zav+1]:=dm[tekd];
dn1[chsd,zav+2]:=0;
zav:=zav+3;
z:=otk;
z1:=zav;
For k:=1 to tdps do
Begin
dn1[chsd,z1]:=dn1[chsd-1,z];
dn1[chsd,z1+1]:=dn1[chsd-1,z+1];
z:=z+2;
z1:=z1+2;
End;
zav:=z1-1;
dn1[chsd,zav+1]:=0;
dn1[chsd,zav+2]:=dm[tekd];
zav:=zav+3;
End;
procedure generate(var dz:dnt);
var
schgot:Integer;
Begin
SetLength(dz,days);
l:=0;
predvar:=0;
kolvar:=1;
tekd:=days;
tdps:=0;
For chsd:=0 to days-1 do
Begin
y:=0;
zav:=0;
l:=(predvar+2)*kolvar*2;
SetLength(dz[chsd],l);
For chsv:=0 to kolvar do
Begin
vetka(dz,y);
y:=y+predvar;
End;
predvar:=predvar+2;
kolvar:=kolvar*2;
tekd:=days-(chsd+1);
tdps:=tdps+1;
End;
sm:=0;
For i:=1 to days do
sm:=sm+dm;
predvar:=predvar-2;
kolvar:=kolvar div 2;
SetLength(dz[days-1],(predvar+2)*kolvar);
z:=0;
z1:=0;
For i:=0 to kolvar do
Begin
schgot:=0;
For k:=1 to predvar div 2 do
Begin
dz[days-1,z1]:=dz[days-2,z];
If dz[days-1,z1]>0 then
schgot:=schgot+dz[days-1,z1];
dz[days-1,z1+1]:=dz[days-2,z+1];
z:=z+2;
z1:=z1+2;
End;
dz[days-1,z1]:=sm-schgot;
dz[days-1,z1+1]:=0;
z1:=z1+2;
End;
End;
function podschot:Single;
var
b,s1,s2,l:Integer;
izgot,xran:Single;
Begin
izgot:=0;
xran:=0;
s1:=0;
s2:=1;
For l:=0 to (predvar div 2) do
Begin
if summ[i,s1]>0 then
Begin
izgot:=izgot+zap+std*summ[i,s1];
End;
if summ[i,s2]>0 then
Begin
For b:=0 to days-((s2+1) div 2) do
Begin
xran:=xran+stx*sqrt(summ[i,s2]);
End;
End;
s1:=s1+2;
s2:=s1+1;
End;
podschot:=xran+izgot;
End;
procedure sum(var s:dnt;var ss:dnt2; var minind:Integer);
var
max:Single;
Begin
max:=0;
minind:=0;
SetLength(s,kolvar);
SetLength(ss,kolvar);
z:=0;
For i:=0 to kolvar-1 do
Begin
SetLength(s,predvar+2);
z1:=0;
For k:=0 to (predvar div 2) do
Begin
s[i,z1]:=dn[days-1,z];
s[i,z1+1]:=dn[days-1,z+1];
z:=z+2;
z1:=z1+2;
End;
ss:=podschot;
End;
For i:=0 to kolvar-1 do
Begin
if ss>max then
max:=ss;
End;
For i:=0 to kolvar-1 do
Begin
if ss<max then
Begin
max:=ss;
minind:=i;
End;
End;
End;
procedure TBeginin.okClick(Sender: TObject);
begin
dm[1]:=d1.Value;
dm[2]:=d2.Value;
dm[3]:=d3.Value;
dm[4]:=d4.Value;
dm[5]:=d5.Value;
dm[6]:=d6.Value;
dm[7]:=d7.Value;
dm[8]:=d8.Value;
std:=Stproizv.Value;
days:=Koldays.Value;
zap:=zapstan.Value;
stx:=Stoimxran.Value;
generate(dn);
sum(summ,sn,minind);
{For i:=0 to days-1 do
Begin
For j:=0 to high(dn) do
Begin
memo1.Lines.Add('dn['+IntToStr(i)+','+intTostr(j)+'] = '+IntToStr(dn[i,j]));
End;
End;
For i:=0 to kolvar-1 do
Begin
For k:=0 to predvar+1 do
Begin
memo1.Lines.Add('summ['+IntToStr(i)+','+intTostr(k)+'] = '+intToStr(summ[i,k]));
End;
End;}
For i:=0 to kolvar-1 do
Begin
memo1.Lines.Add('sn['+IntToStr(i)+'] = '+FloatToStr(sn));
End;
memo1.Lines.Add('минимальная сумма = '+FloatToStr(sn[minind])+' '+IntToStr(minind));
For i:=0 to predvar+1 do
Begin
memo1.Lines.Add('summ['+IntToStr(minind)+','+intTostr(i)+'] = '+intToStr(summ[minind,i]));
End;
summ:=nil;
dn:=nil;
sn:=nil;
End;
end.

4.4K
06 апреля 2006 года
frosty
53 / / 24.09.2004
Попробуй убрать вот это
summ:=nil;
dn:=nil;
sn:=nil;
иногда помогает!
И если у тебя есть динамические переменные, то где тогда функции New(динам.перем.) и Dispose(динам.перемен.)?
И еще есть такая замечательная вещь как отладка по шагам или трассировка, клав. F8 =) будешь знать где и после чего у тебя вылезает подобная ошибка!
6.9K
06 апреля 2006 года
Britney
69 / / 20.03.2006
А я точно могу сказать, что у тебя где-то идет превышение размера массива передаваемого из функции в программу или наоборот!!!! Ищи, место, где ты работаешь с динамическими массивами, но при этом не обращаешь внимание на его длину. Т.е., например,где-нибудь обнуляешь(это к примеру) массив в цикле, но можно случайно обнулить лишнее значение.
Т.е. в функции ты работашь, например, с 10 элементами, а в процедуре у тебя объявлено всего 9 (SetLength(Mas,9)). Также не стоит забывать, что дин.массивы идут с нулевого элемента.
Сам бился вчера над такой же ошибкой - без трассировки и тому подобному(View->Debug Windows->Local Variables) - МЕРТВОЕ ДЕЛО!
1.8K
06 апреля 2006 года
kvadro
35 / / 17.06.2005
Цитата:
Originally posted by frosty
Попробуй убрать вот это
summ:=nil;
dn:=nil;
sn:=nil;
иногда помогает!
И если у тебя есть динамические переменные, то где тогда функции New(динам.перем.) и Dispose(динам.перемен.)?
И еще есть такая замечательная вещь как отладка по шагам или трассировка, клав. F8 =) будешь знать где и после чего у тебя вылезает подобная ошибка!


убрать
summ:=nil;
dn:=nil;
sn:=nil;
не помогает
New и Dispose используются для динамических пременных (по крайней мере в pescale вроде так всегда было)
а динамическому массиву память выделяется или по мере заполнения (что не желательно)
или командой выбора длинны, что предпочтительней)
про пошаговое знаем с паскаля)
спасибо за помощь)

1.8K
06 апреля 2006 года
kvadro
35 / / 17.06.2005
Цитата:
Originally posted by Britney
А я точно могу сказать, что у тебя где-то идет превышение размера массива передаваемого из функции в программу или наоборот!!!! Ищи, место, где ты работаешь с динамическими массивами, но при этом не обращаешь внимание на его длину. Т.е., например,где-нибудь обнуляешь(это к примеру) массив в цикле, но можно случайно обнулить лишнее значение.
Т.е. в функции ты работашь, например, с 10 элементами, а в процедуре у тебя объявлено всего 9 (SetLength(Mas,9)). Также не стоит забывать, что дин.массивы идут с нулевого элемента.
Сам бился вчера над такой же ошибкой - без трассировки и тому подобному(View->Debug Windows->Local Variables) - МЕРТВОЕ ДЕЛО!


т.е. если даже прога работает (считает она усе правильно, проверял вручную) эта бодяга с неправильными адресами (индексами) всё равно будет?
Если так, то буду искать ошибку.
Спасибо за помощь)

1.8K
07 апреля 2006 года
kvadro
35 / / 17.06.2005
Цитата:
Originally posted by Britney
А я точно могу сказать, что у тебя где-то идет превышение размера массива передаваемого из функции в программу или наоборот!!!! Ищи, место, где ты работаешь с динамическими массивами, но при этом не обращаешь внимание на его длину. Т.е., например,где-нибудь обнуляешь(это к примеру) массив в цикле, но можно случайно обнулить лишнее значение.
Т.е. в функции ты работашь, например, с 10 элементами, а в процедуре у тебя объявлено всего 9 (SetLength(Mas,9)). Также не стоит забывать, что дин.массивы идут с нулевого элемента.
Сам бился вчера над такой же ошибкой - без трассировки и тому подобному(View->Debug Windows->Local Variables) - МЕРТВОЕ ДЕЛО!


Ошибка найдена. И точно там где скали. Без Local Variables фигбы допёр что в одном месте лишний раз в цикл захожу и пишу туда где ничего нету.
Спасибо огромное)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог