Is there way of copying the whole array into another array? (Other than using a For-loop)

前端 未结 6 1380
孤街浪徒
孤街浪徒 2020-12-14 23:40

Is there way of copying the whole array into another array? Other than using a for-loop.

Does the move or copy command work for this? I did try but it had an error:

6条回答
  •  遥遥无期
    2020-12-15 00:05

    1- If your array doesn't contain any string or dynamic array, you can use move, but dynamic arrays are not to be handled like fixed-sized arrays:

    var A,B: array[0..10] of integer;
        DA, DB: array of double;
        i: integer;
    begin
      for i := low(A) to high(A) do
        A[i] := i;
      move(A[0],B[0],length(A)*sizeof(A[0]));  // first version, compiler does the stuff
      move(A[0],B[0],sizeof(A)); // it works
      move(A[0],B[0],40); // if you know what you're doing, since sizeof(A)=40
      SetLength(DA,10); // DA[0]..DA[9]
      for i := 0 to high(DA) do // or for i := 0 to 9 if you know what you're doing
        DA[i] := 
      SetLength(DB,length(DA)); 
      if length(DA)<=length(DB) then // if your dynamic array may be void, use this before to avoid GPF
        move(DA[0],DB[0],length(DA)*sizeof(DA[0]));
      if pointer(DA)<>nil then // this will just check that DA[] is not void
        move(pointer(DA)^,pointer(DB)^,length(DA)*sizeof(double)); // similar to previous
    end;
    

    2- If your array contains strings or other reference content array, you have to use a loop:

    var A,B: array[0..10] of string;
        i: integer;
    begin
      for i := 0 to high(A) do
        A[i] := IntToStr(i);
      for i := 0 to high(A) do
        B[i] := A[i]; // this doesn't copy the string content, just add a reference count to every A[], and copy a pointer: it's very fast indeed
    end;
    

提交回复
热议问题