使用常量访问Delphi Array

时间:2013-10-28 23:19:52

标签: delphi pascal

我正在开发一个老式的代码库,而且我对delphi很新,所以如果我的语法有点偏差(或者说是错误的话),请提前道歉。

我有一些预先定义的(在编译时)数组。 arr我们在整个地方使用了

  • file1.pas:arr[1] := 3.14
  • file2.pas:pi := arr[1]

我注意到我们永远不会使用常量来访问数组中的元素。在C中我会写:

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

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

由于

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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%,否则总是使用低()是个好主意和高()来确定迭代数组内容时的索引边界,而不是假设索引基础:

  // 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] := ....

答案 2 :(得分:0)

Delphi中C代码的确切转换将遵循:

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

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