Delphi 错误 E2283 局部常量过多

Posted

技术标签:

【中文标题】Delphi 错误 E2283 局部常量过多【英文标题】:Delphi Error E2283 Too many local constants 【发布时间】:2010-08-18 18:36:23 【问题描述】:

我在 Delphi 2006 中的代码存在编译问题。我使用的是静态字符串数组:

fsi_names : array [0..FSI_NUM_VARS-1] of string;

在程序开始时调用的过程中,我为这个数组赋值。此代码由我编写的脚本自动生成。它由类似于下一行的行组成:

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE';

总共有大约 2000 个元素要分配到这个数组中。我找不到编译器死掉的幻数,但它适用于 1853 而不适用于 2109。

问题是我需要这个数组来将一个 ID(它是数组的索引)转换为一个名称作为各种应用程序的字符串。

我知道,如果我将分配列表拆分并将各个部分放入不同的程序中,那么它会奏效。但由于代码是自动生成的并且经常更改,这种方法不太舒服。

我还考虑将内容放入一个文件并在运行时读取它,但我宁愿将必须发送的文件数量保持在最低限度。另外,我想保护普通用户的内容,以免他乱用。

您知道如何克服编译器的限制,或者更改我的代码以实现我的目标吗?

非常感谢您的帮助。

【问题讨论】:

docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/… 如果在程序之外,该限制是否适用?无论如何,这就是我要放的地方。 @Andreas Rejbrand:谢谢你的提示——我也是通过谷歌找到的,但它没有提到限制数字,我希望在这里得到所有有经验的程序员的建议:—— ) @mj2008:我要检查一下,待命... @mj2008:显然,如果我将它们放在我的单元的 INITIALIZATION 部分或一般 BEGIN 部​​分中,它也适用......所以它不起作用。但是非常感谢你的这个想法! 【参考方案1】:

如果我是你,我会创建一个带有标识符的简单 ASCII 文本文件,以便文件的 idFSI_FLIGHT_PATH_ANGLE + 1 行包含字符串“FSI_FLIGHT_PATH_ANGLE”。然后我会将此文件添加到应用程序的资源中。这样,数据将包含在 EXE 中,您可以在运行时轻松读取数据:

function GetNthString(const N: integer): string;
var
  RS: TResourceStream;
begin
  RS := TResourceStream.Create(hInstance, 'NAMEOFRESOURCE', RT_RCDATA);
  with TStringList.Create do
    try
      LoadFromStream(RS);
      result := Strings[N];
    finally
      Free;
    end;
  RS.Free;
end;

【讨论】:

乍一看,这似乎是一个可行的解决方案。不过,我将不得不查看资源——您能否告诉我是否必须在此文本文件发生更改时手动包含它,例如使用资源编辑器,或者每次构建程序时都从我的硬盘中读取它?如前所述,这些字符串经常变化,所以我想自动完成。谢谢 Delphi 2009 有一个非常好的资源管理器,因此在您构建项目时会自动包含最新版本的文件。然而不幸的是,我相信资源管理器是 Delphi 2009 的新手...... 该死...由于对 Unicode 过敏的组件,我被 2006 卡住了一段时间...有谁知道 2006 版本是否有一种舒适的方式?【参考方案2】:

我找到了解决方案!

如果我在定义数组的位置初始化数组,那么编译器不会吐出错误消息:

const
  fsi_names : array [0..FSI_NUM_VARS-1] of string = (
    'NAME 0',
    'NAME 1',
    ...
    'LAST NAME'
    );

据我所知,如果我这样做,字符串文字的数量是没有限制的。

非常感谢您的想法,mj2008 的想法最有帮助!

祝你有美好的一天

弗洛

【讨论】:

我知道回答自己的问题是很蹩脚的——但上面的解决方案是以最优雅的方式解决问题的,至少对于我的应用程序而言。请注意,我使用的是 CONSTANT 数组,如果您需要使用 VARIABLE 数组 Andreas 的解决方案似乎是要走的路。【参考方案3】:

替代方法是使用动态数组

from
fsi_names : array [0..FSI_NUM_VARS-1] of string;

to
fsi_names: array of string;
SetLength(fsi_names, FSI_NUM_VARS);

干杯

【讨论】:

说实话,我看不出这能解决我的问题。我仍然需要分配大量的字符串文字。还是我误会了? 这与问题无关。编译器在一种方法中因大量常量而窒息。 Delphi 编译器确实有一些超出人们应该编写的限制,但有时它们可​​能会成为自动生成的东西的问题。

以上是关于Delphi 错误 E2283 局部常量过多的主要内容,如果未能解决你的问题,请参考以下文章

为何c语言中出现“字符常量中的字符过多”错误

Delphi 11:常量对象不能作为 var 参数传递

【delphi】动态刷新listview,如果条目过多,会出问题,求解

delphi 常量数组赋值给变量数组

局部常数太多。使用较短的程序错误

delphi调试技巧