如何在Delphi中消除重复常量?

如何在Delphi中消除重复常量?,delphi,Delphi,我的代码使用了两个常量,每个常量以不同的方式描述数组的大小: const ArraySize = 1024; ArrayBits = 10; //2^10 = 1024 bits 我如何用另一个来表达其中的一个?编译器不允许在常量中使用Log2或LdExp 任何版本的Delphi的答案都可以 const ArrayBits = 10; ArraySize = 1 shl ArrayBits; shl b的值等于a*2^b,因此1 shl ArrayBits等于2

我的代码使用了两个常量,每个常量以不同的方式描述数组的大小:

const  ArraySize = 1024;
       ArrayBits = 10;    //2^10 = 1024 bits
我如何用另一个来表达其中的一个?编译器不允许在常量中使用Log2或LdExp

任何版本的Delphi的答案都可以

const
  ArrayBits = 10;
  ArraySize = 1 shl ArrayBits;
shl b的值等于a*2^b,因此1 shl ArrayBits等于2^ArrayBits


shl b的值等于a*2^b,因此1 shl ArrayBits等于2^ArrayBits。

可以这样做:

const  
  ArrayBits = 10;
  ArraySize = 1 shl ArrayBits;

但我可能会回避这一点。这对我来说有点太模糊了。在我看来,你在做算术时应该使用算术运算符


我可能会让您的代码保持原样,并在运行时代码中添加一个断言,说明这两个常量是适当相关的。用注释记录它。

好吧,你可以这样做:

const  
  ArrayBits = 10;
  ArraySize = 1 shl ArrayBits;

但我可能会回避这一点。这对我来说有点太模糊了。在我看来,你在做算术时应该使用算术运算符


我可能会让您的代码保持原样,并在运行时代码中添加一个断言,说明这两个常量是适当相关的。用注释记录它。

“我认为在执行算术时应该使用算术运算符。”--当然,这在原则上似乎是公平的,但当没有算术运算符可以满足您的要求时,我认为使用位运算符没有问题。@hvd没问题。这只是我个人的观点和偏好。我想要它是因为我觉得这是一个很好的理由。尽管两行是相邻的,但我犯了一个错误,改变了其中一行而不是另一行。我专注于代码,决定更改数组大小,按住Ctrl键单击声明,更改后弹出。然后浪费了15分钟,想知道出了什么问题。如果我(作者)能做到这一点,我怎么能不这样做呢?(我能说什么呢?昨晚我很累,累是愚蠢的。)规则是:如果两个部分相互依赖,就让依赖变得明显。哦,第二行的评论是为了表示依赖性,但是失败了。我完全理解你的动机。我只是不喜欢用移位来做算术。对于某些算术运算来说,位移位量是不够的。这就是为什么我建议使用一个断言来防止您的错误。好吧,断言将捕获错误,而不是阻止它。:-)但是断言应该在代码中,远离接口中的声明。我不想做的一件事就是将其转移到实现中。我有三个常数:ArrayBits=10;ArraySize=1个shl位;和ArrayMask=ArraySize-1;代码清楚地读作Index:=散列和数组掩码;其中写入索引是不明确的:=散列和((1 shl ArrayBits)-1);“在我看来,在执行算术时,应该使用算术运算符。”--当然,这在原则上似乎是公平的,但当没有算术运算符满足您的要求时,我认为使用位运算符没有问题。@hvd这很好。这只是我个人的观点和偏好。我想要它是因为我觉得这是一个很好的理由。尽管两行是相邻的,但我犯了一个错误,改变了其中一行而不是另一行。我专注于代码,决定更改数组大小,按住Ctrl键单击声明,更改后弹出。然后浪费了15分钟,想知道出了什么问题。如果我(作者)能做到这一点,我怎么能不这样做呢?(我能说什么呢?昨晚我很累,累是愚蠢的。)规则是:如果两个部分相互依赖,就让依赖变得明显。哦,第二行的评论是为了表示依赖性,但是失败了。我完全理解你的动机。我只是不喜欢用移位来做算术。对于某些算术运算来说,位移位量是不够的。这就是为什么我建议使用一个断言来防止您的错误。好吧,断言将捕获错误,而不是阻止它。:-)但是断言应该在代码中,远离接口中的声明。我不想做的一件事就是将其转移到实现中。我有三个常数:ArrayBits=10;ArraySize=1个shl位;和ArrayMask=ArraySize-1;代码清楚地读作Index:=散列和数组掩码;其中写入索引是不明确的:=散列和((1 shl ArrayBits)-1);你难道不知道吗?当我今天看它的时候,我看到答案就在代码里盯着我的脸。跳到这里,发现你们几分钟内就回答了。干得好。你不知道吗?当我今天看到它的时候,我看到答案就在代码里盯着我的脸。跳到这里,发现你们几分钟内就回答了。干得好。别忘了接受最好的答案。别忘了接受最好的答案