Delphi“常量数组中的未声明标识符”

时间:2014-08-14 13:10:24

标签: constants delphi-xe4 delphi

我有以下陈述:

type tx = Record
      a : string;
      b : integer;
     end;

const
     x : tx = (a: 'a'; b: 1);
     xs : array of tx = ((x));

编译器给了我:“Undeclared Identifier'x'”

我不明白为什么,因为'x'是在'xs'数组声明和常量类型匹配之前声明的。我很欣赏任何启发;

3 个答案:

答案 0 :(得分:4)

原始答案中的代码不是导致您报告的错误消息的代码。我试图尽可能地修复它,但是发布实际代码确实付出代价而不是它的近似值。

无论如何,假设这就是你所拥有的。

const
  x: tx = (a: 'a'; b: 1);
  xs: array of tx = ((x));

x的声明没问题。这定义了所谓的typed constant

xs的声明无效,原因有两个:

  1. 您无法为动态数组类型声明类型常量。
  2. 常量声明中的值必须为constant expressions。这排除了使用x作为任何常量声明中的值。
  3. 现在,你可能有什么,从错误判断更像是这样:

    const
      x: tx = (a: 'a'; b: 1);
      xs : array [0..0] of tx = ((x));
    

    这会给出您报告的错误。即:

      

    E2003未声明的标识符:'x'

    那是因为上面列表中的第2项。代码无法编译,因为x不是常量表达式。

    引用常量表达式的文档:

      

    常量表达式是编译器可以在不执行其发生的程序的情况下进行求值的表达式。常量表达式包括数字;字符串;真常数;枚举类型的值;特殊常量True,False和nil;和表达式由这些元素专门构建,包含运算符,类型转换和集合构造函数。

    请注意,类型常量不会出现在列表中,这就是x不是常量表达式的原因。

    鉴于这一切,你可以做的最好的事情,宣告一个常数,可能是:

    const
      xs: array [0..0] of tx = ((a: 'a'; b: 1));
    

答案 1 :(得分:0)

尝试

const
  x1 : tx = (a: 'a'; b : 1);
  x2 : tx = (a: 'aa'; b : 11);
  xs : array[1..2] of tx = ( (a: 'a'; b : 1) , (a: 'aa'; b : 11) );

一些在线参考文献:

编辑:David的答案包含密钥 - 常量定义不能使用本身不是常量的表达式。

答案 2 :(得分:-1)

我决定声明一个变量语句,它将全局常量保存为动态数组。在运行时,我使用该特定单元所需的propper常量语句填充该数组。

interface
...
type tx = Record
  a : string;
  b : integer;
end;
...
const x1 : tx = (a: 'a1'; b: 1);
      x2 : tx = (a: 'a2'; b: 2);
      x3 : tx = (a: 'a3'; b: 3);
...
var xs : array of tx; 
...
implementation
...
procedure SetXs;
begin
  SetLength (xs, 1);
  xs [0] := x1;
  SetLength (xs, 2);
  xs [1] := x3;
end;
...

我不知道这是最好还是最优雅的方式,但它现在适合我。我接受了建议。感谢。