多维动态数组起始值能否不从0开始,以及一个循环。 (20分)

  • 主题发起人 主题发起人 春风江南
  • 开始时间 开始时间

春风江南

Unregistered / Unconfirmed
GUEST, unregistred user!
能不能有setlength(A,1..4)
 
不能, 但你可以不用。
 
那我想实现从1开始的动态数组,怎么办?
 
你0不用不就行了!呵呵!
 
将动态数组长度多设一个,0不用.
 
to Leechange
我有一段fortran的程序,要译成pascal的,不想改变原始的循环。你能看看吗?
就在这个问题的底下...
 
sorry,fortran我是文盲.
 
现在有许多数值计算的程序是用fortran和c写的,叫我这样喜欢delphi又懂其他的人
很是为难。
 
其实yong的方法就可以,也多占用不了多少内存。
 
你可以通过下面方式实现动态数组,不知能否适用你;
type
TIntArray=array[1..1] of integer;// (或2..2)设置为想要的值,类型也可设置为其它类型
PIntArray=^TIntArray;

var
pInt:PIntArray;
Index:Integer;
begin
GetMem(pInt,SizeOf(Integer)*4);// 分配内存(4个长,数组可以用1..4)
Index:=1;//
pInt^[Index]:=1;// 使用变量做索引,但要注意在改变索引时不能越界
Inc(Index);
pInt^[Index]:=2;
Inc(Index);
pInt^[Index]:=3;
Inc(Index);
pInt^[Index]:=4;
// 对数组的应用
……
FreeMem(pInt);// 不要忘了释放内存
end;
 
我的这段代码为什么不能通过呢?是sqrt的原因,还是loop超值了?
type TM=array of array of double;
TN=array of double;
procedure ACHOL(var A:TM
var n:integer
var D:TN);
var i,j,k:integer;
begin
setlength(A,n+1,n+1);setlength(D,n+1);
A[1,1]:=sqrt(A[1,1]);
for j:=2 to n do
begin A[1,j]:=A[1,j]/A[1,1]
end;
for i:=2 to n do
begin //10
for j:=2 to i do
begin A[i,i]:=A[i,i]-A[j-1,i]*A[j-1,i]
end;
A[i,i]:=sqrt(A[i,i])

if (i<>n) then
begin
for j:=i+1 to n do
for k:=2 to i do
A[i,j]:=A[i,j]-A[k-1,i]*A[k-1,j];
A[i,j]:=A[i,j]/A[i,i];
end;
end
//10

D[1]:=D[1]/A[1,1];
for i:=2 to n do begin
for k:=2 to i do
begin D:=D-A[k-1,i]*D[k-1]
end;
D:=D/A[i,i];
end;

D[n]:=D[n]/A[n,n];
for k:=n downto 2 do begin
for i:=k to n do begin D[k-1]:=D[k-1]-A[k-1,i]*D
end;
D[k-1]:=D[k-1]/A[k-1,k-1];
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var A:TM
n:integer
D:TN;
begin
n:=2;
setlength(A,n+1,n+1);
setlength(D,n+1);
A[1,1]:=1
A[1,2]:=2
D[1]:=1;
A[2,1]:=2
A[2,2]:=1
D[2]:=2;
ACHOL(A,n,D);
showmessage(format('%f,%f',[D[1],D[2]]))
end;

end.
 
就是这一句 A[i,i]:=sqrt(A[i,i])

//[Warning] Unit1.pas(44): FOR-Loop variable 'j' may be undefined after loop
为什么呢
 
你的程序有问题:(粗看了一下,不行再说)
错误一:
setlength(A,n+1,n+1)
//1
.......
ACHOL(A,n,D);
-----
procedure ACHOL(var A:TM
var n:integer
var D:TN);
.....
setlength(A,n+1,n+1)
//A在 1 时就分配了地址,不必再分配,这个习惯不好
...

错误二:
for j:=2 to n do //j是循环变量了!
begin A[1,j]:=A[1,j]/A[1,1]
end;
for i:=2 to n do
begin //10
for j:=2 to i do //不允许再使用j作为变量了!
 
错误二:
for j:=2 to n do
begin
A[1,j]:=A[1,j]/A[1,1]

end;

for i:=2 to n do
begin //10
for j:=2 to i do //其实是两个循环
即使换成,也不行。
for j1:=2 to n do
begin
A[1,j1]:=A[1,j1]/A[1,1]

end;

for i:=2 to n do
begin //10
for j:=2 to i do
 
a:array of [1..3,2..4];
 
我自己知道问题出在这一句A[i,i]:=sqrt(A[i,i])
但是我不知道怎么改,为什么错了。
其实这是用平方根法求解对称正定方程组的程序,我是从fortran译过来的。有些问题,
大虾们帮我查查吧。
 
是我看错了,但你的程序有点乱.
另外 A[i,i]:=Sqrt(A[i,i])肯定没错,
看错误信息是说j在循环后直接被使用了,
我怀疑你的 A[i,i]:=Sqrt(A[i,i])中的某个i是被误写成j了
 
不会写错的。是的,程序有点乱。我是从fortran翻译过来的,但是把那一句去掉,就
可以运算。只是结果不对.
是不是A[i,i]可能为负数呀?但是原来的程序也没加abs啊。
 
后退
顶部