0

我正在研究一个老式的代码库,而且我对 delphi 很陌生,所以如果我的语法有点不对(或者只是完全错误),请提前道歉。

我有一个预定义的(在编译时)数组之类的东西。arr我们到处都用过

  • 文件1.pas:arr[1] := 3.14
  • 文件2.pas:pi := arr[1]

而且我注意到我们从不使用常量来访问数组中的元素。在 CI 中会写:

int arr[100] = {0};
常量 int MY_INDEX=1;
arr[MY_INDEX] = 3.14

等等,但我在我的 delphi 代码库中看不到这一点。那是因为 Delphi/Pascal 不支持它还是因为原作者决定不这样做?

谢谢

4

3 回答 3

3

Delphi 允许您使用常量作为数组索引。因此,如果您在代码中没有看到这样的内容,那是因为作者选择不为数组索引声明和使用常量。

于 2013-10-28T23:41:29.467 回答
2

是的,常量可以与任何计算结果为数组的适当且有效索引的表达式一起使用。您还应该注意,Delphi 中的数组可以使用基于非零的索引范围声明:

var
  MonthlyTotals: array[1..12] of Integer;  // Jan = 1, Feb = 2 etc etc

您甚至可以将数组的索引指定为枚举类型,并使用枚举成员作为索引,从而提供更严格的安全性(在可能和适当的情况下),根据这个人为的示例:

type
  TFileFormat = (ffXML, ffCSV, ffText, ffJSON);

var
  sExtensions: array[TFileFormat] of String;

sExtensions[ffXML]  := 'xml';
sExtensions[ffCSV]  := 'csv';
sExtensions[ffText] := 'txt';
sExtensions[ffJSON] := 'json';

在这种情况下,数组可能只有枚举中某些(连续)值的成员:

var
  sExtensions: array[ffXML..ffCSV] of String;

出于这个原因,以及数组索引可能不是从零开始的事实,除非您 110% 确定数组的索引范围,否则最好始终使用Low()High()来确定索引范围迭代数组的内容而不假设索引基础:

  // This will not work properly:
  for i := 0 to 11 do
    MonthlyTotals[i] := ....

  // Neither will this, even though it looks more safe
  for i := 0 to Pred(Length(MonthlyTotals)) do
    MonthlyTotals[i] := ....

  // This will be safe:
  for i := Low(MonthlyTotals) to High(MonthlyTotals) do
    MonthlyTotals[i] := ....

  // And it works for enum indices as well:
  for ext := Low(sExtensions) to High(sExtensions) do
    sExtensions[ext] := ....
于 2013-10-29T03:22:05.213 回答
0

在 Delphi 中您的 C 代码的确切转换将遵循以下行:

var
  arr: array[100] of integer;
const
  MY_INDEX = 1;
begin
  arr[MY_INDEX] := 3.14;
end;

正如其他人所说,完全可行,枚举方法可以说是更好的选择。这里的一个问题是,这依赖于 Delphi 将数组初始化为零,而不是像在 C 中那样显式设置它。

于 2013-10-30T09:17:48.160 回答