我正在开发一个老式的代码库,而且我对delphi很新,所以如果我的语法有点偏差(或者说是错误的话),请提前道歉。
我有一些预先定义的(在编译时)数组。 arr
我们在整个地方使用了
arr[1] := 3.14
pi := arr[1]
我注意到我们永远不会使用常量来访问数组中的元素。在C中我会写:
int arr[100] = {0}; const int MY_INDEX=1; arr[MY_INDEX] = 3.14
等。但我没有在我的delphi代码库中看到这一点。那是因为Delphi / Pascal不支持它还是因为原作者决定不这样做?
由于
答案 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中那样明确地设置它。