求助——delphi程序结束时‘无效指针’的提示
程序只有两个过程:formcreat,btn1click.代码全部通过,但程序运行完时,输出文件已经生成,但project文件运行到最后end时出现提示:---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
我程序的源代码如下,请各位大哥大姐给我找找原因,项目急需(这是段代码是建立一个模型,读取输入文件,进行计算,然后把结果写入输出文件):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Math;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
n:Integer;
d:array of TDateTime;
wa:array of Double;
SD:TDateTime;
SW:Double;
da:array of TDateTime;
dat:array of Double;
Le:array of Double;
Ve:array of Double;
W:array of Double;
B:array of array of Double;
E:array of array of Double;
F:array of array of Double;
WV,WL,WD:array of array of array of Double;
RV,RL,RD:array of array of Double;
RV1,RL1,RD1:array of array of Double;
RV2,RL2,RD2:array of array of Double;
AA2:array of Double;
AV,AL,AD:array of Double;
BV,BL,BD:array of Double;
R2:array of array of Double;
B2:array of Double;
B3:array of Double;
fina:array of Double;
B4:array of Double;
procedure Result(fina:array of Double);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
L:array[0..6] of Integer=(145,150,155,160,165,170,175);
V:array[0..7] of Integer=(0,5,10,15,20,25,30,35);
SL=5;
SV=5;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var myfile:TextFile;
s:string;
date:TDateTime;
i,j,k,p:Integer;
water,temp,def,sum4,sum5,sum6:Double;
maxRL1,minRL1,maxRV1,minRV1,maxRD1,minRD1:Double;
a0,b0,c0,d0,e0,f0,g0,h0,i0,j0,a1,a2,a3:Double;
maxa,maxb:array of Double;
sum1,sum2,sum3:Double;
m:Integer;
y:Integer;
begin
//********************** 导入数据 **********************
AssignFile(myfile,extractfilepath(Application.ExeName)+'in.txt');
Reset(myfile);
Readln(myfile,s);
n:=StrToInt(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
m:=StrToInt(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
y:=StrToInt(s);
SetLength(d,m);
SetLength(wa,y);
Readln(myfile,s);
for i:=0 to m-2 do
begin
d[i]:=StrToInt(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
end;
d[m-1]:=StrToInt(s);
SD:=Abs(d[1]-d[0]);
Readln(myfile,s);
for i:=0 to y-2 do
begin
wa[i]:=StrToFloat(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
end;
wa[y-1]:=StrToFloat(s);
SW:=Abs(wa[1]-wa[0]);
SetLength(da,n);
SetLength(dat,n);
SetLength(Le,n);
SetLength(Ve,n);
SetLength(W,n);
for i:=0 to n-1 do
begin
Readln(myfile,s);
date:=StrToDateTime(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
water:=StrToFloat(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
temp:=StrToFloat(Copy(s,1,Pos(',',s)-1));
s:=Copy(s,Pos(',',s)+1,Length(s));
def:=StrToFloat(s);
da[i]:=date;
dat[i]:=(da[i]-da[0])/365;
Le[i]:=water;
Ve[i]:=temp;
W[i]:=def;
end;
//*****************************************
SetLength(B,8,y);
SetLength(WV,n,8,y);
for j:=0 to y-1 do
for k:=0 to 7 do
begin
B[k,j]:=0;
end;
for i:=0 to n-1 do
for j:=0 to y-1 do
for k:=0 to 6 do
begin
if (W[i]>=Wa[j]) and (W[i]<=Wa[j+1]) then
begin
if (Ve[i]>V[k]) and (Ve[i]<=V[k+1]) then
begin
WV[i,k,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(Ve[i]-V[k])/5);
WV[i,k+1,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(Ve[i]-V[k+1])/5);
WV[i,k,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(Ve[i]-V[k])/5);
WV[i,k+1,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(Ve[i]-V[k+1])/5);
end;
end;
B[k,j]:=B[k,j]+WV[i,k,j];
end;
//****************************************
SetLength(E,7,y);
SetLength(WL,n,7,y);
for j:=0 to y-1 do
for k:=0 to 6 do
begin
E[k,j]:=0;
end;
for i:=0 to n-1 do
for j:=0 to y-1 do
for k:=0 to 5 do
begin
if (W[i]>=Wa[j]) and (W[i]<=Wa[j+1]) then
begin
if (Le[i]>L[k]) and (Le[i]<=L[k+1]) then
begin
WL[i,k,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(Le[i]-L[k])/5);
WL[i,k+1,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(Le[i]-L[k+1])/5);
WL[i,k,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(Le[i]-L[k])/5);
WL[i,k+1,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(Le[i]-L[k+1])/5);
end;
end;
E[k,j]:=E[k,j]+WL[i,k,j];
end;
//*******************************************
SetLength(F,m,y);
SetLength(WD,n,m,y);
for j:=0 to y-1 do
for k:=0 to m-1 do
begin
F[k,j]:=0;
end;
for i:=0 to n-1 do
for j:=0 to y-1 do
for k:=0 to m-2 do
begin
if (W[i]>=Wa[j]) and (W[i]<=Wa[j+1]) then
begin
if (dat[i]>d[k]) and (dat[i]<=d[k+1]) then
begin
Wd[i,k,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(dat[i]-d[k])/SD);
Wd[i,k+1,j]:=(1-abs(W[i]-wa[j])/SW)*(1-abs(dat[i]-d[k+1])/SD);
Wd[i,k,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(dat[i]-d[k])/SD);
Wd[i,k+1,j+1]:=(1-abs(W[i]-wa[j+1])/SW)*(1-abs(dat[i]-d[k+1])/SD);
end;
end;
F[k,j]:=F[k,j]+WD[i,k,j];
end;
//********************************************
SetLength(maxa,8);
a0:=B[1,0];
for k:=0 to 7 do
begin
for j:=0 to y-1 do
begin
if B[k,j]>=a0 then
a0:=B[k,j];
end;
maxa[k]:=a0;
end;
SetLength(maxb,y);
for j:=0 to y-1 do
begin
for k:=0 to 7 do
begin
if B[k,j]>=a0 then
a0:=B[k,j];
end;
maxb[j]:=a0;
end;
SetLength(RV,8,y);
for k:=0 to 7 do
for j:=0 to y-1 do
begin
RV[k,j]:=B[k,j]/max(maxa[k],maxb[j]);
end;
//********************************************
SetLength(maxa,7);
b0:=E[1,0];
for k:=0 to 6 do
begin
for j:=0 to y-1 do
begin
if B[k,j]>=a0 then
b0:=B[k,j];
end;
maxa[k]:=b0;
end;
SetLength(maxb,y);
for j:=0 to y-1 do
begin
for k:=0 to 6 do
begin
if B[k,j]>=a0 then
b0:=B[k,j];
end;
maxb[j]:=b0;
end;
SetLength(RL,7,y);
for k:=0 to 6 do
for j:=0 to y-1 do
begin
RL[k,j]:=B[k,j]/max(maxa[k],maxb[j]);
end;
//********************************************
SetLength(maxa,m);
c0:=E[1,0];
for k:=0 to m-1 do
begin
for j:=0 to y-1 do
begin
if B[k,j]>=a0 then
c0:=B[k,j];
end;
maxa[k]:=c0;
end;
SetLength(maxb,y);
for j:=0 to y-1 do
begin
for k:=0 to m-1 do
begin
if B[k,j]>=a0 then
c0:=B[k,j];
end;
maxb[j]:=c0;
end;
SetLength(RD,m,y);
for k:=0 to m-1 do
for j:=0 to y-1 do
begin
RD[k,j]:=B[k,j]/max(maxa[k],maxb[j]);
end;
//********************************************
SetLength(RL1,7,y);
for j:=0 to y-1 do
for k:=0 to 6 do
begin
RL1[k,j]:=L[k]-wa[j];
end;
d0:=0;
e0:=0;
for j:=0 to y-1 do
for k:=0 to 6 do
begin
if RL1[k,j]>=d0 then
d0:=RL1[k,j];
if RL1[k,j]<=e0 then
e0:=RL1[k,j];
end;
SetLength(RL2,7,y);
maxRL1:=d0;
minRL1:=e0;
for j:=0 to y-1 do
for k:=0 to 6 do
begin
RL2[k,j]:=(e0+0.5*d0)/(RL1[k,j]+0.5*d0);
end;
sum1:=0;
for j:=0 to y-1 do
for k:=0 to 6 do
begin
sum1:=sum1+RL2[k,j];
end;
a1:=sum1/7*y;
//*************************
SetLength(RV1,8,y);
for j:=0 to y-1 do
for k:=0 to 7 do
begin
RV1[k,j]:=V[k]-wa[j];
end;
f0:=0;
g0:=0;
for j:=0 to y-1 do
for k:=0 to 7 do
begin
if RV1[k,j]>=f0 then
f0:=RV1[k,j];
if RV1[k,j]<=g0 then
g0:=RV1[k,j];
end;
SetLength(RV2,8,y);
maxRV1:=f0;
minRV1:=g0;
for j:=0 to y-1 do
for k:=0 to 7 do
begin
RV2[k,j]:=(g0+0.5*f0)/(RV1[k,j]+0.5*f0);
end;
sum2:=0;
for j:=0 to y-1 do
for k:=0 to 7 do
begin
sum2:=sum2+RV2[k,j];
end;
a2:=sum2/7*y;
//*************************
SetLength(RD1,m,y);
for j:=0 to y-1 do
for k:=0 to m-1 do
begin
RD1[k,j]:=d[k]-wa[j];
end;
h0:=0;
i0:=0;
for j:=0 to y-1 do
for k:=0 to m-1 do
begin
if RD1[k,j]>=h0 then
h0:=RD1[k,j];
if RD1[k,j]<=i0 then
i0:=RD1[k,j];
end;
SetLength(RD2,m,y);
maxRD1:=h0;
minRD1:=i0;
for j:=0 to y-1 do
for k:=0 to m-1 do
begin
RD2[k,j]:=(i0+0.5*h0)/(RD1[k,j]+0.5*h0);
end;
sum3:=0;
for j:=0 to y-1 do
for k:=0 to m-1 do
begin
sum3:=sum3+RD2[k,j];
end;
a3:=sum3/m*y;
//******************************
SetLength(AA2,3);
j0:=a1+a2+a3;
AA2[1]:=a1/j0;
AA2[2]:=a2/j0;
AA2[3]:=a2/j0;
//********************************************
SetLength(AL,7);
SetLength(AV,8);
SetLength(AD,m);
SetLength(BL,y);
SetLength(BV,y);
SetLength(BD,y);
SetLength(R2,3,y);
SetLength(B2,y);
SetLength(B3,y);
SetLength(fina,n);
for i:=0 to n-1 do
begin
for k:=0 to 5 do
begin
if (Le[i]>=L[k]) and (Le[i]<=L[k+1]) then
AL[k]:=1-abs(Le[i]-L[k])/5;
AL[k+1]:=1-abs(Le[i]-L[k+1])/5;
end;
for k:=0 to 6 do
begin
if (Ve[i]>=V[k]) and (Ve[i]<=V[k+1]) then
AV[k]:=1-abs(Ve[i]-V[k])/5;
AV[k+1]:=1-abs(Ve[i]-V[k])/5;
end;
for k:=0 to m-1 do /
begin
if (dat[i]>=d[k]) and (dat[i]<=d[k+1]) then
AD[k]:=1-abs(dat[i]-d[k])/SD;
AD[k+1]:=1-abs(dat[i]-d[k])/SD;
end;
BL[0]:=0;
BV[0]:=0;
BD[0]:=0;
for j:=0 to y-1 do
begin
for k:=0 to 6 do
begin
BL[j]:=BL[j]+AL[k]*RL[k,j];
end;
for k:=0 to 7 do
begin
BV[j]:=BV[j]+AV[k]*RV[k,j];
end;
for k:=0 to m-1 do
begin
BD[j]:=BD[j]+AD[k]*RD[k,j];
end;
end;
for j:=0 to y-1 do
begin
R2[0,j]:=BL[j];
R2[1,j]:=BV[j];
R2[2,j]:=BD[j];
end;
sum4:=0;
sum5:=0;
sum6:=0;
for j:=0 to y-1 do
begin
for k:=0 to 2 do
begin
sum6:=sum6+AA2[K]*R2[k,j];
end;
B2[j]:=sum6;
B2[j]:=B2[j]*B2[j];
sum4:=sum4+B2[j];
B3[j]:=wa[j]*B2[j];
sum5:=sum5+B3[j];
end;
fina[i]:=sum5/sum4;
end;
SetLength(B4,n);
for i:=0 to n-1 do
begin
B4[i]:=W[i]+fina[i];
end;
CloseFile(myfile);
result(fina);
end;
procedure TForm1.Result(fina:array of Double);
var rf:TextFile;
i:Integer;
str0,str1,str2,str3,ok:string;
begin
Rewrite (rf,extractfilepath(Application.ExeName)+'out.txt');
Writeln(rf,'**'+' '+'**'+' '+'**'+' '+'**');
str0:='';str1:='';str2:='';str3:='';
for i:=0 to n-1 do
begin
str0:=DateToStr(da[i]);
str1:=FormatFloat('0.0000',W[i]);
str2:=FormatFloat('0.0000',B4[i]);
str3:=FormatFloat('0.0000',fina[i]);
ok:='#'+str0+';'+' '+str1+';'+' '+str2+';'+' '+str3+';';
Writeln(rf,ok);
end;
CloseFile(rf);
Application.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
var ff:string;
begin
ff:=extractfilepath(Application.ExeName)+'test.txt';
if FileExists(ff) then
begin
btn1Click(Sender);
end
else
application.Terminate;
end;
end.