记录构造函数可以使记录常量更简洁吗?

时间:2011-11-28 22:32:49

标签: delphi syntax constructor record

我有一些表格数据:

Foo       Bar
-------------
fooes     42
bars      666 
...

所以,我声明了实体结构:

type TFoo = record
  Foo: string;
  Bar: Integer
end;

和实体表:

const FOOES = array [M..N] of TFoo = (
  // Have to specify the field names for each record...
  (Foo: 'fooes'; Bar:  42),
  (Foo: 'bars';  Bar: 666)
  { so on }
);

如您所见,这看起来非常冗长和冗余,这是因为我初始化了所有记录的所有字段。如果我复制其他地方准备的表格数据,那么会进行大量编辑。我宁愿不枚举所有的字段,坚持更简洁的C风格,即只有常量。这里是记录构造函数......

在这种情况下,记录构造函数可以帮助我吗?

以下是C中的示例。您会注意到我们不必在每个声明中指定字段名称:

#include <stdio.h>

typedef struct {
        char    foo[10];
        int     bar;
} foo;

int main(void) {
        /* Look here */
        foo FOOES[2] = {{"foo", 42}, {"bar", 666}};
        int i = 0;
        for (; i < 2; i++) {
                printf("%s\t%d\n", FOOES[i].foo, FOOES[i].bar);
        }
        return 0;
}

3 个答案:

答案 0 :(得分:3)

const只是一个只读var,在启动可执行文件时会在代码中加载/映射。

您可以创建var记录(或const但覆盖writable const option),然后在设备的初始化部分对其进行初始化。

var FOOES = array [M..N] of TFoo;

....

initialization
  SetFooArray(FOOES,['fooes',42,'bar',230]);
  ...
end.

自定义SetFooArray()功能会将所有array of const参数放入FOOES。

我有时使用这种技术初始化可计算数组(例如转换或查找表)。有时候,在启动时计算一次大型数组是有意义的,在源代码中保存一些常量KB,只需几行代码。

但我不确定在你的情况下是否值得。默认的const声明有点冗长,但如果您使用Ctrl + C / Ctrl + V或查找和替换,则不会出现问题。它是最标准的,如果您稍后更改记录布局是安全的(而C构造可以编译而没有错误),并将创建一个真正的常量。

答案 1 :(得分:2)

记录构造函数仅适用于运行时,因此对于常量,您当前的解决方案是唯一的选择。

答案 2 :(得分:0)

如果您希望在源代码中完成,那么您输入的内容就是答案。当然,您可以将数据放在单独的数组中并以这种方式初始化它们,但这会使您的代码看起来很混乱。

您还可以将它们存储在文本文件(Foo = Bar格式)中,并在运行时(TStringList)将其读入SL.LoadFromFile()。但即使使用排序TStringList,效率也会低得多(例如MyVariable := SL.Values['Foo1'];)。

在源代码之外有一百万种方法可以解决这个问题。从另一个方向取得它,将数据放入Excel并创建一个Excel宏来构建源并将其放入剪贴板以粘贴到您的PAS文件中。这不会比在IDE中格式化Delphi代码更困难,也可能更容易。