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

Posted

技术标签:

【中文标题】局部常数太多。使用较短的程序错误【英文标题】:Too many local constants. Use shorter procedures error 【发布时间】:2015-07-15 12:06:08 【问题描述】:

我正在使用 Delphi 6,我正在准备一个列表,其中包含一些变量字符串名称及其指针引用。代码有点像,

var
  VarList: TstringList;

procedure AddNameList(aName :string; aRef: TObject);
begin
  VarList.AddObject(aName, aRef);
end;

上面的方法AddNameList在Unit1.pas中被调用,我有大约5到6千个条目,这可能会增加。

现在 unit1 包含

AddNameList('MyVar1', MyVar1);
AddNameList('MyVar2', MyVar2);
AddNameList('MyVar3', MyVar3);
...
..
..
AddNameList('MyVar5000', MyVar5000);

编译器给了我错误

局部常量太多。使用更短的程序

我试图把它分成两个程序然后它也没有工作。 我提到了可用的帖子,类似于这个错误,建议使用常量数组。但是在那种情况下,我需要维护两个常量数组,并且维护这两个数组会很困难,因为常量的数量很大。有没有其他方法可以解决这个问题。

【问题讨论】:

您是否考虑过将数据移动到文件中,并改为在运行时读取文件? 是的,我尝试在单独的单元文件中移动 AddNameList 方法。 我正在考虑将数据移动到外部文件,但问题是我需要对象引用。如果我的值是字符串或整数类型,则只能使用外部文件。 const myVarName = 'MyVar'; AddNameList(myVarName+IntToStr(1),MyVar1); 只需要一个字符串常量。 【参考方案1】:

根据我的实验,Delphi 6 的上限为 3297 个不同的字符串文字。此限制是每单位限制。因此,一种解决方案是找到一种方法将您的代码拆分为单独的单元。它不是很优雅,但是这段代码对我来说似乎不是很优雅,坦率地说,我不确定使用多个单元真的会让事情变得更糟。

更新

事实证明我的实验进行得很糟糕。限制实际上是每个功能而不是每个单元。所以将代码拆分成多个函数就足够了。


值得一提的是,现代版本的 Delphi 对每个单元的字符串文字数量有更大的限制(如果确实有限制的话)。在 XE7 中,我在没有编译器反对的情况下达到了 160,000 个不同的文字,然后我放弃了。

大概你的代码是自动生成的吧?我想知道您是否可以用调用AddNameList 的循环替换这个对AddNameList 的巨大调用列表。要传递给AddNameList 的数据必须从某个地方读取,可能是链接资源。或者甚至有可能以编程方式生成所有这些调用。

如果不知道您如何使用不同的调用而不是迭代来发现自己的代码的确切细节,在我看来,很难提供更详细的建议。

【讨论】:

感谢 cmets,实际情况就像我正在开发一个需要所有资源字符串名称列表的应用程序。 我想我回答了你问的问题。我不想在 cmets 中回答不同的问题。 我 [仍在] 使用 Delphi XE2。我自己的实验表明限制在 700 到 800 之间。此外,尽管我不完全确定,如果您在一个过程中使用相同的文字两次(例如,“Applesauce”和“Applesauce”),Delphi 会自动将它们组合起来并算作一个。【参考方案2】:

您可以按照错误消息的建议解决问题:将您的程序分成几个较小的程序。

【讨论】:

【参考方案3】:

为了减少字符串常量的数量:

procedure AddNameList(aName :string; aRef: TObject; index: Integer);
begin
  VarList.AddObject(aName+IntToStr(index), aRef);
end;

const myVarName = 'MyVar';

AddNameList(myVarName,MyVar1,1);
...
AddNameList(myVarName,MyVarN,N);

【讨论】:

以上是关于局部常数太多。使用较短的程序错误的主要内容,如果未能解决你的问题,请参考以下文章

最短的C程序,还是会导致段错误

如何使用短路径在 Nx Workspace 中导入?

将内容放在较短的列下方

使用较短的字符串更新字段

Windows 错误:源路径太长

C语言编译、连接的各种错误