怎么样在过程中正确使用setlength函数!(50分)

  • 主题发起人 主题发起人 chenxiu
  • 开始时间 开始时间
C

chenxiu

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是我的一段代码,我的本意是每次调用Test过程就给x和y数组补零到长度l,但是我发现在过程中用setlength函数老是出错!下面的代码运行时 就出错!请高手指点!
procedure Test(Var x,y:array of real;m,n,l:integer);
var
i:integer;
xx,yy:array of real;
begin
SetLength(xx,l);
SetLength(yy,l);
for i:=1 to m do xx:=x;
for i:=m+1 to l do xx:=0;
for i:=1 to n do yy:=y;
for i:=n+1 to l do yy:=0;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,m,n,l:integer;
x,y:array of real;
begin
m:=3;
n:=4;
Setlength(x,m);
Setlength(y,n);
x[1]:=1;x[2]:=2;x[3]:=3;
y[1]:=1;y[2]:=2;y[3]:=3;y[4]:=4;
Test(x,y,m,n,l);
for i:=1 to m do
begin
Memo1.Lines.Add(floattostr(x));
end;
end;
 
SetLength后,下标是从0到n-1的,而不是从1到n
 
SetLength后,下标是从0到n-1的,而不是从1到n
使用时最用使用Low和High来取得上下标
还有
SetLength不能对参数中的动态数组使用
Var x,y:array of real
你这里的x,y就不能使用SetLength
局部变量 XX,YY使用SetLength还是可以的
 
即使象你说的setlength的后下标从0到n-1,那我把上面的程序中数组的下标做了相应的修改后,程序运行还是通不过啊? 是怎么回事啊?
 
你只说运行出错,什么错?错在哪?你不会自己跟踪看一下吗?
 
你错的多着咧
上下标函数 和调用都使用错了
还有你说的想实现的“Test过程就给x和y数组补零到长度l”在函数里也是不可能实现的
 
晚起的小虫: 我在程序中x可以用setlength的啊
procedure TForm1.Button1Click(Sender: TObject);
var
i,m,n,l:integer;
x,y:array of real;
begin
m:=3;
n:=4;
Setlength(x,m);
Setlength(y,n);
x[0]:=1;x[1]:=2;x[2]:=3;
y[0]:=1;y[1]:=2;y[2]:=3;y[3]:=4;

for i:=0 to m-1 do
begin
Memo1.Lines.Add(floattostr(x));
end;
end;
这个代码运行通过的啊 你运行看看!
 
type
TRealArray = array of real;

procedure Test(var x,y:TRealArray;m,n,l:integer);
var
i:integer;
begin
SetLength(x,l);
SetLength(y,l);
for i:=m to l-1 do
x:=0;
for i:=n to l-1 do
y:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,m,n,l:integer;
x,y:TRealArray;
begin
m:=3;
n:=4;
l:=10;
Setlength(x,m);
Setlength(y,n);
x[0]:=1;x[1]:=2;x[2]:=3;
y[0]:=1;y[1]:=2;y[2]:=3;y[3]:=4;
Test(x,y,m,n,l);
Memo1.Clear;
for i:=0 to l-1 do
begin
Memo1.Lines.Add('x'+IntToStr(i) + '='+floattostr(x));
Memo1.Lines.Add('y'+IntToStr(i) + '='+floattostr(y));
end;

end;
 
谢谢各位的指点:我把下标改成从0开始后的代码如下,运行还是出错,原因如下:Project project2.exe raised exception class EAccessViolation with message 'Access violation at address 0044FC30 in module 'project2.exe'.Write of address 00000000'Process stopped.由于小弟对delphi的数组不是很熟悉,我用了分步调试但是只出错,不知道 错在哪里!谢谢各位 多多指点!
procedure Test(Var x,y:array of real;m,n,l:integer);
var
i:integer;
xx,yy:array of real;
begin
SetLength(xx,l);
SetLength(yy,l);
for i:=0 to m-1 do xx:=x;
for i:=m to l-1 do xx:=0;
for i:=0 to n do yy:=y;
for i:=n to l-1 do yy:=0;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,m,n,l:integer;
x,y:array of real;
begin
m:=3;
n:=4;
Setlength(x,m);
Setlength(y,n);
x[0]:=1;x[1]:=2;x[2]:=3;
y[0]:=1;y[1]:=2;y[2]:=3;y[3]:=4;
test(x,y,m,n,l);
for i:=0 to l-1 do
begin
Memo1.Lines.Add(floattostr(xx));
end;
end;
end.
 
你的l没有初始化
 
你在这样写当然可以Setlength(x,m)
我的意思是,你不能在test里Setlength(x,m)
 
轻舞飞扬:你的运行是对的;但是我的本意是想在过程中动态调用分配一个数组,比如下面代码中的xx,这个根据你的代码改来的,但是运行出错,为什么?还有你用TRealArray 和直接x:array of real 有什么区别指出?请多多指点!
procedure Test(var x,y:TRealArray;m,n,l:integer);
var
i:integer;
xx:TRealArray;
begin

SetLength(x,l);
SetLength(y,l);
SetLength(xx,l);
for i:=m to l-1 do
x:=0;
for i:=n to l-1 do
y:=0;
for i:=0 to 100 do
begin
xx:=xx+1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,m,n,l:integer;
x,y:TRealArray;
begin
m:=3;
n:=4;
l:=10;
Setlength(x,m);
Setlength(y,n);
x[0]:=1;x[1]:=2;x[2]:=3;
y[0]:=1;y[1]:=2;y[2]:=3;y[3]:=4;
Test(x,y,m,n,l);
Memo1.Clear;
for i:=0 to l-1 do
begin
Memo1.Lines.Add('xx'+IntToStr(i) + '='+floattostr(xx));
Memo1.Lines.Add('y'+IntToStr(i) + '='+floattostr(y));
end;

end;
 
小虫:你不能在test里Setlength(x,m)?为什么 ?具体到底要怎么样才可以正确使用Setlength啊
 
轻舞肥羊?还在吗?
 
不用TRealArray就不能对var x,y这两个变量SetLength
for i:=0 to 100 do
begin
xx:=xx+1;
end;
这里大错,1.下标越界,2.没有初始化
for i:=0 to l-1 do
begin
xx:=i+1;
end;
 
轻舞肥羊:我想在你刚刚给出的这个过程 Test中再使用setlength去分配别的数组,如我刚在你给的基础上改的那个xx数组,这个数组在test中有别的用处,我在你给的test中加了xx数组,但是运行还是出错,请指点一下!这个xx应该怎么定义和分配?
 
轻舞肥羊:按你的说法加了xx数组后,可以继续使用,但是我想问下如果程序在调用完test后,还要用test过程中的一些参数,比如test中的这个xx数组,那我应该怎么定义xx啊?
按你的方法使用完test后,我调用xx 时程序说 xx没有定义 怎么解决?
 
你的xx是局部变量,不能在过程外使用
你要在外面使用就要定义成全局变量或类的域
比如在这定义
var
Form1 : TForm1;
xx : TRealArray;
这样在本单元及引用了本单元的所有单元都能引用xx变量
 
谢谢你们的指点!
 

Similar threads

后退
顶部