var A : array[0..3999] of integer; begin //...... move(A[200], A[0], 3800);//这就是把后200~3999元素复制给0~3799元素。 //......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800] end;
前面我的代码忽视了一个细节:数据长度。move是以字节为单位进行复制的,所以,如果是Integer类型(4字节),就要改一下我的代码:var A : array[0..3999] of integer; begin //...... move(A[200], A[0], 3800*4);//这就是把后200~3999元素复制给0~3799元素。 ~~~~~~~ //......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800] end;你可以根据你的元素类型长度,灵活运用
浪的思路和我想的差不多 ,不过如何实现 使用指针吗? _______________________________________________ 不用指针.每个数组只用1个变量记录头就可以了.比如head 一般访问第一个数组都是A[0],第I个数组就是A[I]. 现在第一个数组就是A[head],第I个数组就是A[I+head] 如果I+head>3999,则第I个数组就是A[I+head-4000] 代码大致如下: X:=I+head; if X>3999 then X:=X-4000; A[X]就是第I个元素了.
不用指针.每个数组只用1个变量记录头就可以了.比如head 一般访问第0个元素都是A[0],第I个元素就是A[I]. 现在第0个元素就是A[head],第I个元素就是A[I+head] 如果I+head>3999,则第I个元素就是A[I+head-4000] 代码大致如下: X:=I+head; if X>3999 then X:=X-4000; A[X]就是第I个元素了.
实际上简单类型的数组,4000个元素,做楼主要求的赋值,速度很快的,使用者根本觉察不到速度差异。比如: var A : array[0..3999] of integer; I : integer; begin //..... for I := 0 to 3799 do A[I] := A[I+200]; showmessage('ok'); end; 这样也不慢。如果数据量非常非常大,还可以参考记录类型。
我得程序是这样写的 var i:integer; voltBufBuf:array[0..16383] of double; S1,S2,S3,S4,S5,S6,S7,S8:array[0..2047] of double;
ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,fftyarry:array[0..4095] of double; //LEN<小于2048 把大数组的数据分配到8个小的数组中 for i:=0 to LEN-1 do S1[i]:=voltBuf[i]; for i:=LEN to 2*LEN-1 do S2[i-LEN]:=voltBuf[i]; for i:=2*LEN to 3*LEN-1 do S3[i-2*LEN]:=voltBuf[i]; for i:=3*LEN to 4*LEN-1 do S4[i-3*LEN]:=voltBuf[i]; for i:=4*LEN to 5*LEN-1 do S5[i-4*LEN]:=voltBuf[i]; for i:=5*LEN to 6*LEN-1 do S6[i-5*LEN]:=voltBuf[i]; for i:=6*LEN to 7*LEN-1 do S7[i-6*LEN]:=voltBuf[i]; for i:=7*LEN to 8*LEN-1 do S8[i-7*LEN]:=voltBuf[i]; //分析S1...S8 大家给个意见
A : array[0..3999] of integer;
begin
//......
move(A[200], A[0], 3800);//这就是把后200~3999元素复制给0~3799元素。
//......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800]
end;
A : array[0..3999] of integer;
begin
//......
move(A[200], A[0], 3800*4);//这就是把后200~3999元素复制给0~3799元素。
~~~~~~~
//......给3800~3999元素赋新值。可以参考move函数,用一个200元素的数组move到A[3800]
end;你可以根据你的元素类型长度,灵活运用
_______________________________________________
不用指针.每个数组只用1个变量记录头就可以了.比如head
一般访问第一个数组都是A[0],第I个数组就是A[I].
现在第一个数组就是A[head],第I个数组就是A[I+head]
如果I+head>3999,则第I个数组就是A[I+head-4000]
代码大致如下:
X:=I+head;
if X>3999 then
X:=X-4000;
A[X]就是第I个元素了.
一般访问第0个元素都是A[0],第I个元素就是A[I].
现在第0个元素就是A[head],第I个元素就是A[I+head]
如果I+head>3999,则第I个元素就是A[I+head-4000]
代码大致如下:
X:=I+head;
if X>3999 then
X:=X-4000;
A[X]就是第I个元素了.
var
A : array[0..3999] of integer;
I : integer;
begin
//.....
for I := 0 to 3799 do
A[I] := A[I+200];
showmessage('ok');
end;
这样也不慢。如果数据量非常非常大,还可以参考记录类型。
var
i:integer;
voltBufBuf:array[0..16383] of double;
S1,S2,S3,S4,S5,S6,S7,S8:array[0..2047] of double;
ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,fftyarry:array[0..4095] of double; //LEN<小于2048 把大数组的数据分配到8个小的数组中
for i:=0 to LEN-1 do S1[i]:=voltBuf[i];
for i:=LEN to 2*LEN-1 do S2[i-LEN]:=voltBuf[i];
for i:=2*LEN to 3*LEN-1 do S3[i-2*LEN]:=voltBuf[i];
for i:=3*LEN to 4*LEN-1 do S4[i-3*LEN]:=voltBuf[i];
for i:=4*LEN to 5*LEN-1 do S5[i-4*LEN]:=voltBuf[i];
for i:=5*LEN to 6*LEN-1 do S6[i-5*LEN]:=voltBuf[i];
for i:=6*LEN to 7*LEN-1 do S7[i-6*LEN]:=voltBuf[i];
for i:=7*LEN to 8*LEN-1 do S8[i-7*LEN]:=voltBuf[i];
//分析S1...S8
大家给个意见