2013-04-29 43 views
2

我宣佈我var節這德爾福計劃兩件事情:創建字符串數組 - 常量表達式預期的錯誤

LCloneTask1, LCloneTask2, LCloneTask3, ... , LCloneTask20 : String; 
    CloneTaskArray : array[0..19] of String = (LCloneTask1, LCloneTask2, LCloneTask3,.., LCloneTask20); 

當第一行聲明一些字符串和第二行聲明說字符串數組。這個數組的大小通常是20。

當我嘗試編譯時出現錯誤「預期的常量表達式」。我沒有正確地聲明一個字符串數組?我需要能夠在程序中稍後讀取和寫入此數組。

+0

你並不需要在第一線的所有。只是'CloneTaskArray:String [0..19];' – 2013-04-29 18:34:36

+0

如果我不包含第一個列表,我會在數組變量名上得到一堆紅色的Undeclared Identifier警告...... – ikathegreat 2013-04-29 18:40:30

+0

使用數組或者變量,而不是兩者。你在內存中爲同一目的的兩個不同的字符串定義了兩個不同的地方。而不是閱讀'LCloneTask1'而不是讀取'CloneTaskArray [0]'。或者,如David所述,使用指向這些字符串的指針。 – 2013-04-29 18:41:21

回答

3

您正試圖初始化一個變量作爲其聲明的一部分。的documentation指出語法必須:

var identifier: type = constantExpression; 

其中常量表達式是表示類型類型的 值的任何常量表達式。

documentation for constant expressions說(重點煤礦):

常量表達式是編譯器可以不執行在其發生的程序計算表達式。常量表達式包括數字;字符串;真常數;枚舉類型的值;特殊常量True,False和零;以及由這些元素完全由操作符,類型轉換和設置構造函數構建的表達式。常量表達式不能包含變量,指針或函數調用。

你違反了最後一句,特別是我強調的部分。


很可能你所要做的就是聲明一個字符串數組。在這種情況下,你會簡單的寫:

var 
    CloneTaskArray: array[0..19] of string; 

如果您需要初始化數組,在單位的initialization節宣佈他們這樣做的:

initialization 
    CloneTaskArray[0] := 'boo'; 
    CloneTaskArray[1] := 'yah'; 
    .... 

我注意到你正試圖用其他字符串變量初始化數組的元素。有了一個簡單的例子,我想知道,如果你想做到這一點:

var 
    s1, s2: string; 
    StringArray: array[0..1] of string; 
.... 
StringArray[0] := s1; 
StringArray[1] := s2; 

,然後我不知道你是希望你可以這樣做:

s1 := 'boo'; 
Assert(StringArray[0] = 'boo'); 

如果這是你希望什麼,你會感到失望的。 Delphi中的字符串數據類型非常複雜,但基本上它的行爲類似於一個值類型。如果你正在嘗試做什麼,我概括上面你需要使用引用字符串變量:

type 
    PString = ^string; 
var 
    s1, s2: string; 
    StringArray: array[0..1] of PString; 
.... 
StringArray[0] := @s1; 
StringArray[1] := @s2; 

,然後你可以寫的確:

s1 := 'boo'; 
Assert(StringArray[0]^ = 'boo'); 
+0

雖然我想我理解爲什麼我/程序不能以我已經完成的方式初始化一個常量表達式的推理,但我仍然需要嘗試以我描述的方式創建數組(在程序期間使用r/w )。這是說這是無法完成的嗎? – ikathegreat 2013-04-29 18:43:01

+0

我不知道你的意思。 – 2013-04-29 18:43:48

+0

您使用'CloneTaskArray:array [0..19] string'的註釋;'因爲聲明足以讓我掌握,謝謝。 – ikathegreat 2013-04-29 18:45:14