一个简单的过程和数组,可是不行呀,急!(50分)

  • 主题发起人 主题发起人 lj.ah
  • 开始时间 开始时间
L

lj.ah

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现在一个stringgrid里输入一个矩阵,每个元素加一以后在另一个stringgrid中
输出。仅仅用了一个过程和一个2维动态数组,但是不行。
type
AA=array of array of integer;
procedure text(A:AA var m,n:integer);
var i,j:integer;
begin
setlength(A,m,n);
for i:=1 to m do
for j:=1 to n do
A[i,j]:=A[i,j]+1;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var B:AA;m,n,i,j:integer;
begin
m:=3;n:=4;
setlength(B,m,n);
begin
for i:=1 to m do
for j:=1 to n do
B[i,j]:=strtoint(stringgrid1.cells[j,i]);
end;
text(B, m, n)
//Missing operator or semicolon
for i:=1 to m do
for j:=1 to n do
StringGrid2.cells[j,i]:=inttostr(B[i,j]);
end;
 
你将text函数换一个名称就可以了。
 
text是保留字
 
换个名字编译是通过了,可是执行时,出现了非法操作,mmd,烦...
 
单步跟踪一下,看到哪一步的时候出现非法操作的?
 
这样不对:
for i:=1 to m do
for j:=1 to n do
A[i,j]:=A[i,j]+1;
应该这样:
for i:=0 to m-1 do
for j:=0 to n-1 do
A[i,j]:=A[i,j]+1;
可变数组是从0开始.

 
好像还是不行,仍然是非法操作。
 
贴出错信息,否则也说不清你的错误。
 
type
AA = array of array of integer;

procedure text2(A: AA
var m, n: integer);
var
i, j: integer;
begin
setlength(A, m, n);
for i := 0 to m - 1 do
for j := 0 to n - 1 do
A[i, j] := A[i, j] + 1;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
B: AA;
m, n, i, j: integer;
begin
m := 3;
n := 4;
setlength(B, m, n);
begin
for i := 0 to m - 1 do
for j := 0 to n - 1 do
B[i, j] := i * j;
end;
text2(B, m, n);
end;
这段程序没问题,你查查StringGrid的读写是否有问题。
 
不知为什么,把A[i, j] := A[i, j] + 1;不论换成什么表达式如A[i, j] := A[i, j] + 5;
都不影响B【2,3】的值,可见没有调用text2(B, m, n);,或者是什么地方有问题。
你们试试?
 
这样不对:
procedure text(A:AA var m,n:integer);
...
SetLength(A,...)

应该这样:
procedure text(var A:AA var m,n:integer);
...
SetLength(A,...)
如果不Var A:AA那么SetLength(A,...) 要出错
 
谢谢Darwinzhang的提醒,是对的。
那是不是动态数组都要从0开始,如果我想不给A[0,0]赋值行不行?
 
根据我所知道的,可变数组是从0开始的,当然你可以不用a[0,0],但是为什么不用能?
遍程应该符合Delphi规范才好.
 
本来我以为使用动态数组一定要在最后使用SetLength(A,0..)才会使A的内存释放,
可是我仔细一分析才发现Delphi会自动释放A的内存,根本不必要手动释放内存!
我还得感谢你,我受指针的影响形成了一种偏见,多亏你的问题我才仔细的想了以下这个问题。
 
多人接受答案了。
 
后退
顶部