要吐血身亡了,动态数组的释放问题???(50分)

  • 主题发起人 主题发起人 steelg
  • 开始时间 开始时间
S

steelg

Unregistered / Unconfirmed
GUEST, unregistred user!
实在想不明白啊,相关代码如下:
with form1.Query1 do
begin
close;
sql.clear;
sql.add('select TM,Z from st_river_r_z');
sql.add('where stcd= :stcd and ((tm between :tstart and :tend)');
sql.Add('or tm=(select max(tm) from st_river_r_z where tm< :tstart and stcd= :stcd)');
sql.Add('or tm=(select max(tm) from st_river_r_z where tm< :tstart and stcd= :stcd))');
sql.add('order by tm asc');
parambyname('stcd').AsString:='50229350';
parambyname('tstart').Asdatetime:=strtodatetime(tstart0);
parambyname('tend').Asdatetime:=strtodatetime(tend0)+11;
open;
end;
setlength(z0,form1.Query1.RecordCount);
setlength(t0,form1.Query1.RecordCount);
setlength(z1,trunc((tend-tstart)*24));
setlength(t1,trunc((tend-tstart)*24));
form1.Query1.First;
for i := 0 to form1.Query1.RecordCount do
begin
t0:=form1.Query1.Fields[0].AsDateTime;
z0:=form1.Query1.Fields[1].AsFloat;
form1.Query1.Next;
end;
m:=0;
n:=trunc((tend-tstart)*24)-1;
for j := 0 to n do
begin
while t0[m]=t0[m+1] do
begin
m:=m+1;
end;
t1[j]:=tstart+j/24;
while t1[j]>t0[m+1] do
begin
repeat
m:=m+1;
until t1[j]<t0[m+1];
end;
z1[j]:=z0[m]+(z0[m+1]-z0[m])/(t0[m+1]-t0[m])*(t1[j]-t0[m]);
end;

z0:=nil;
t0:=nil;
with form1.Query1 do
begin
close;
sql.clear;
sql.add('select TM,Q from st_river_r_Q');
sql.add('where stcd= :stcd and ((tm between :tstart and :tend)');
sql.Add('or tm=(select max(tm) from st_river_r_Q where tm< :tstart and stcd= :stcd)');
sql.Add('or tm=(select max(tm) from st_river_r_Q where tm< :tstart and stcd= :stcd))');
sql.add('order by tm asc');
parambyname('stcd').AsString:='50229350';
parambyname('tstart').Asdatetime:=strtodatetime(tstart0);
parambyname('tend').Asdatetime:=strtodatetime(tend0)+11;
open;
end;
setlength(q0,form1.Query1.RecordCount);
setlength(t0,form1.Query1.RecordCount);
setlength(q1,trunc((tend-tstart)*24));
form1.Query1.First;
for i := 0 to form1.Query1.RecordCount do
begin
t0:=form1.Query1.Fields[0].AsDateTime;
q0:=form1.Query1.Fields[1].AsFloat;
form1.Query1.Next;
end;
m:=0;
for j := 0 to n do
begin
while t0[m]=t0[m+1] do
begin
m:=m+1;
end;
while t1[j]>t0[m+1] do
begin
repeat
m:=m+1;
until t1[j]<t0[m+1];
end;
q1[j]:=q0[m]+(q0[m+1]-q0[m])/(t0[m+1]-t0[m])*(t1[j]-t0[m]);
end;

q0:=nil;???????????
t0:=nil;

上面的z0、t0和后面的t0释放都没问题,就是这个q0的释放总是出错“invalid pointer operation”,finalize(q0),setlength(q0,0)都试过还是老错误
 
动态数组不用手动释放吧
 
因为我要用的动态数组长度是随sql查询记录数变化的,那在重新定义数组长度时,前面已经赋值过的就需要先释放了
 
只要 setlength 该数组为零
 
我试过了setlength(q0,0),不行
如果不释放,直接再调用setlength定义数组新的长度,又跳出eaccessviolation错误
真是莫名其妙啊
 
setlength(q0,0):=nil;
 
我现在干脆设置成一个足够长度的静态数组了
delphi总是出些莫名其妙的错误,有点受不了
 
释放了还能重新setLength?
 
动态数组是可以用SetLength来释放的。
出现“invalid pointer operation”、eaccessviolation错误应该是你访问了下标越界的数组。

有两处地方有这段代码:
for i := 0 to form1.Query1.RecordCount do
begin
t0:=form1.Query1.Fields[0].AsDateTime;
z0:=form1.Query1.Fields[1].AsFloat;
form1.Query1.Next;
end;
既然t0、Z0的下标都是以0开始,怎么是以RecordCount结束呢?应该是RecordCount-1吧?
把这两段代码改成这样:
for i := 0 to form1.Query1.RecordCount-1 do
begin
t0:=form1.Query1.Fields[0].AsDateTime;
z0:=form1.Query1.Fields[1].AsFloat;
form1.Query1.Next;
end;
 
email_chen 是正确的哦
 
没错,数组首先要注意不要越界,编译时不出错,使用时就可能出错。
 
接受答案了.
 

Similar threads

后退
顶部