2010-02-03 114 views
4

我有一個數組聲明:有沒有簡單的方法來克隆字符串數組?

const A: array[0..3] of ShortString = (
    'Customer', 
    'Supplier', 
    'Stock', 
    'GL' 
); 

var B: array of ShortString; 

我想字符串數組克隆到另一個陣列B.使用移動或複製功能不起作用。有沒有一種快速簡便的方法來克隆數組而不使用for循環?

回答

11

您面臨的問題是您的常量A和您的變量B實際上是不同的類型。

type 
    TSA = array[0..3] of ShortString; 

const 
    A: TSA = (
    'Customer', 
    'Supplier', 
    'Stock', 
    'GL'); 

var B: TSA; 

有了這些聲明,那麼你可以簡單的寫:這可以通過向您展示如何聲明的方式相當於一個const和相同類型的變種向您展示在你的問題是什麼最容易被證明

B := A; 

但當是一個尺寸的陣列和是一個動態數組,這是不可能的,只能選擇到SetLength(B)根據需要並複製元件一個接-一。

雖然常量VAR類型可能看起來像它們是相同的 - 或兼容類型 - 它們都沒有了,這便是沒有從試圖分配整數不變的字符串不同變量...即使知道實現它所需的簡單轉換,編譯器不能推測你打算這樣做,所以你必須明確並自己提供轉換代碼。

2

喜歡的東西:

SetLength(B, Length(A)); 
for i := Low(A) to High(A) do 
    B[i] := A[i]; 

或者在一個更通用的方法:

type 
    TStringArray = array of ShortString; 

procedure CloneArray(const source: array of ShortString; var dest: TStringArray); 
var 
    i: integer; 
begin 
    SetLength(dest, Length(source)); 
    for i := Low(source) to High(source) do 
    dest[i] := source[i]; 
end; 

在你將不得不重新聲明B中B中的一種情況:TStringArray。

+0

謝謝。但是我想知道如果沒有使用for循環的話。 – 2010-02-03 06:58:28

+0

我不認爲沒有循環就可以完成。你爲什麼不做循環呢? – 2010-02-03 07:03:57

+0

在上例中,您可以使用Move(Source,Dest [0],Length(Source)* SizeOf(ShortString))來代替for循環 – kludg 2010-02-03 09:05:00

相關問題