现在有个大数组有4000个元素,想每次新加200个元素, 新加之前要把前边的200个删除,后边的 3800移动到前边,再添加新的200个元素,我现在用的是静态数组,向这样的大数组同时有10个, 有没有更快的办法啊

解决方案 »

  1.   

    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;
      

  2.   

    前面我的代码忽视了一个细节:数据长度。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;你可以根据你的元素类型长度,灵活运用
      

  3.   

    浪的思路和我想的差不多 ,不过如何实现 使用指针吗?
    _______________________________________________
    不用指针.每个数组只用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个元素了.
      

  4.   

    不用指针.每个数组只用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个元素了.
      

  5.   

    实际上简单类型的数组,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;
    这样也不慢。如果数据量非常非常大,还可以参考记录类型。
      

  6.   

    我得程序是这样写的  
    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
    大家给个意见
      

  7.   

    不是固定长度,程序中的Len是变的
      

  8.   

    循环队列、FIFO队列,或者用一个整型数标志数组起点。