2

我在我的var部分中为这个 Delphi 程序声明了两件事:

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

其中第一行声明了一些字符串,第二行声明了一个所述字符串的数组。这个数组的大小总是 20。

当我尝试编译时,我得到一个错误,“预期的常量表达式”。我没有正确声明字符串数组吗?我需要能够稍后在程序中读取和写入该数组。

4

1 回答 1

3

您正在尝试初始化一个变量作为其声明的一部分。该文档指出语法必须是:

var identifier: type = constantExpression;

其中 constantExpression 是表示类型类型值的任何常量表达式。

常量表达式的文档说(强调我的):

常量表达式是编译器可以在不执行它所在的程序的情况下计算的表达式。常量表达式包括数字;字符串;真正的常数;枚举类型的值;特殊常量 True、False 和 nil;以及使用运算符、类型转换和集合构造函数专门从这些元素构建的表达式。常量表达式不能包含变量、指针或函数调用。

你违反了最后一句话,特别是我强调的部分。


您很可能只想声明一个字符串数组。在这种情况下,您只需编写:

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');
于 2013-04-29T18:36:28.267 回答