我有一些表格数据:
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;
}
答案 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代码更困难,也可能更容易。