8

我试图在 Delphi(即 Delphi 2005)中定义一个基于其他常量的 const,但 Delphi 抱怨它不是一个常量表达式。这就是我的代码的样子:

program myProgram;

const
  Xpoints = 20;
  Ypoints = 30;
  ArraySize = trunc(sqrt(Xpoints*Ypoints));

var
  myArray : array[1..ArraySize] of integer;

我可以做 ArraySize = Xpoints*Ypoints 但 sqrt 会导致问题。这个想法是我希望数组由常量 Xpoints 和 Ypoints 来调整大小。我可以做这样的事情:

program myProgram;

const
  sqrtXpoints = 4.472135956;
  sqrtYpoints = 5.47722557506;
  Xpoints = trunc(sqrtXpoints*sqrtXpoints);
  Ypoints = trunc(sqrtYpoints*sqrtYpoints);
  ArraySize = trunc(sqrtXpoints*sqrtYpoints);

var
  myArray : array[1..ArraySize] of integer;

注意稍微高估 trunc 的平方根值。如果我更改 sqrtXpoints 或 sqrtYpoints,一切都会正确更新,但这种方法看起来很……愚蠢。

作为一个临时修复,我可以像这样自己评估常量:

program myProgram;

const
  Xpoints = 20;
  Ypoints = 30;
  ArraySize = 24;

var
  myArray : array[1..ArraySize] of integer;

但我不喜欢这样,因为如果我更改 Xpoints 或 Ypoints,ArraySize 不会自动更新。

似乎编译器应该知道如何在编译时评估定义为另一个常量的数学函数的常量,例如上面的示例,甚至更简单的事情:

const
  pi = 4.0*arctan(1.0);

但我无法让它接受它。有什么建议么?在此先感谢您的帮助!

4

1 回答 1

7

Delphi 不允许在常量定义中使用大部分函数。但是您可以轻松解决它,只需使用动态数组,您就可以从代码中计算出您想要的所有内容:

const
  Xpoints = 20;
  Ypoints = 30;
var
  myArray : array of integer;

procedure TForm9.FormCreate(Sender: TObject);
begin
  setlength(myArray, trunc(sqrt(Xpoints*Ypoints)));

end;
于 2013-08-26T20:12:03.433 回答