procedure TForm1.Button1Click(Sender: TObject);
type
ARR1=ARRAY OF integer;
ARR2=ARRAY OF real;
ARR3=ARRAY OF ARRAY OF integer;
ARR4=ARRAY OF ARRAY OF real;
var
partsum,sum:extended;
num,hang:longint;
ff,Qu,NCMAX,M,N,inttao,alph,k,i,j,ALL,a,e,NC:integer;
fff,rou,aipu,Bmins,p,q,a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,c0,c1,c2,c3:real;
route:ARR3;
tao1,tao2,detatao1,detatao2:ARR4;
pper,per,mins,r,t,rs,WQ,u,W,s,resi,BESTS,BESTT,WS,WT:ARR2;
begin
rou:=0.7;Qu:=10;aipu:=0.000001;NCMAX:=200;M:=20;N:=10;
inttao:=1;alph:=1;a0:=-0.57721566;a1:=0.99999193;a2:=-0.24991055;a3:=0.05519968;
a4:=-0.00976004;a5:=0.00107857;b0:=0.2677737343;b1:=8.6347608925;b2:=18.059016973;
b3:=8.5733287401;c0:=3.9584969228;c1:=21.0996530827;c2:=25.6329561486; c3:=9.5733223454;
setlength(route,M+1,3);
setlength(tao1,1,11);
setlength(tao2,11,11);
setlength(detatao1,1,11);
setlength(detatao2,11,11);
setlength(pper,12);
setlength(per,11);
setlength(mins,M+1);
setlength(r,ALL);
setlength(t,ALL);
setlength(rs,ALL);
setlength(WQ,ALL);
setlength(u,ALL);
setlength(W,ALL);
setlength(s,ALL);
setlength(resi,ALL);
setlength(BESTS,NCMAX+1);
setlength(BESTT,NCMAX+1);
setlength(WS,11);
setlength(WT,11);
for i:=0 to 10 do
begin
WS[i]:=0.1*i/N;
end;
for j:=0 to 10 do
begin
WT[j]:=1000*j/N;
end;
NC:=0;
BESTS[NC]:=0.03;
BESTT[NC]:=48;
if (WS[10]-WS[0])/N>=aipu then
begin
if NC>0 then
begin
if (BESTS[NC]-trunc(BESTS[NC])=0) and (BESTS[NC]<>BESTS[NC-1]) then
for i:=0 to 10 do
begin
WS[i]:=BESTS[NC]-5+i;
memo1.Lines.Add(floattostr(WS[i]));
end
else
for i:=0 to 10 do
begin
p:=i;
for e:=0 to cal(BESTS[NC]) do
begin
p:=p/10;
end;
WS[i]:=BESTS[NC]+p;
memo1.Lines.Add(floattostr(WS[i]));
end;
end;
if NC=0 then
begin
if BESTS[NC]-trunc(BESTS[NC])=0 then
for i:=0 to 10 do
begin
WS[i]:=BESTS[NC]-5+i;
memo1.Lines.Add(floattostr(WS[i]));
end
else
for i:=0 to 10 do
begin
p:=i;
for e:=0 to cal(BESTS[NC]) do
begin
p:=p/10;
end;
WS[i]:=BESTS[NC]+p;
memo1.Lines.Add(floattostr(WS[i]));
end;
end;
end;
if (WT[10]-WT[0])/N>=aipu then
begin
if NC>0 then
begin
if (BESTT[NC]-trunc(BESTT[NC])=0) and (BESTT[NC]<>BESTT[NC-1]) then
for j:=0 to 10 do
begin
WT[j]:=BESTT[NC]-5+j;
memo2.Lines.Add(floattostr(WT[j]));
end
else
for j:=0 to 10 do
begin
q:=j;
for e:=0 to cal(BESTS[NC]) do
begin
q:=q/10;
end;
WT[j]:=BESTT[NC]+q;
memo2.Lines.Add(floattostr(WT[j]));
end;
end;
if NC=0 then
begin
if (BESTT[NC]-trunc(BESTT[NC])=0) then
for j:=0 to 10 do
begin
WT[j]:=BESTT[NC]-5+j;
memo2.Lines.Add(floattostr(WT[j]));
end
else
for j:=0 to 10 do
begin
q:=j;
for e:=0 to cal(BESTT[NC]) do
begin
q:=q/10;
end;
WT[j]:=BESTT[NC]+q;
memo2.Lines.Add(floattostr(WT[j]));
end;
end;
end;
end;
我是小白,delphi初學者。單獨除錯這一小段程式的時候,有時候第一次能運行出資料結果,但是之后再運行的時候卻會報錯:out of memory!請問到底是什么原因導致的??
uj5u.com熱心網友回復:
大哥,你真的是新手么
uj5u.com熱心網友回復:
是!這個問題是什么原因引起的??
uj5u.com熱心網友回復:
解決問題前,至少代碼先優化一下:去除重復代碼,抽取子方法—— if (WT[10]-WT[0])/N>=aipu then代碼段和if (WS[10]-WS[0])/N>=aipu then代碼段是完全重復,抽取一個為子方法,引數為陣列;memo2.Lines.Add(floattostr(WT[j]));也可以獨立一個子方法,方便統一處理,有利于后續維護;
要優先考慮CPU支持的資料型別:為什么需要用Real,而不考慮double或單精度?
代碼中,有些變數可以抽取為常量宣告,特別是SetLength設定陣列長度的幾個變數;
——————————
總之,保持代碼的清晰度,方便自己也方便他人。
關于出錯問題,原因在于你的變數“All”沒有初始化,可能會是任何一種值;每次執行,會因為所在堆疊的值不同而不同,糟糕的狀況下,會出現out of memory。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110164.html
標籤:語言基礎/算法/系統設計
