数组的指定初始化——Ada应用实例之九
一帖子询问如何理解下面的C程序:
FEFRM event[ ] = {
[C_CMD_SET_POWER_S] = {FAC_CMD_SET_P, 5, 1},
[C_CMD_SET_FAC_M] = {FAC_CMD_SET_FAC_M, 5, 1},
[...]={....}
};
C_CMD_SET_POWER_、C_CMD_SET_FAC_M、FAC_CMD_SET_P等都是如下定义的枚举值。
typedef enum
{
C_CMD_SET_POWER_S = 0x1,
C_CMD_SET_FAC_M = 0x2,
} COMM_CMD_FUNC_CODE;
typedef enum
{
FACTORY_CMD_INVALID = 0x0,
FACTORY_CMD_TIMEOUT = 0x1,
FACTORY_CMD_FAIL = 0x2,
FACTORY_CMD_SU = 0x3,
FAC_CMD_SET_FAC_M = 0x4,
FAC_CMD_SET_P = 0x5,
} FACTORY_CMD;
上述程序应用了ISO C99标准的一个特色,即指定初始化(designated initializer)。
C99允许通过指定索引或结构域名,使初始化值以任意顺序出现。指定数组索引的方法是在初始化值前写 '[INDEX] =',要指定一个范围使用 '[FIRST ... LAST] =' 的形式。
例如:
int a[6] = { [4] = 29, [2] = 15 };
这相当于:
int a[6] = { 0, 0, 15, 0, 29, 0 };
如果假定FEFRM是如下的结构类型:
typedef struct
{
FACTORY_CMD cmd;
int parameter_1;
int parameter_2;
} FEFRM;
那么帖子中的例子就是一个通过指定数组索引来给出初值的结构数组。
Ada语言提供了类似的机制,称为指名的聚合(named aggregate)。在Ada程序中,可通过指名的聚合来对数组赋初值,即在初值前面增加下标值和符号=〉,使初值赋给指定的数组分量。例如:
type Vector is array (Integer range <>) of Float;
V: Vector(1 .. 5) := (3 .. 5 => 1.0, 6 | 7 => 2.0);-- [1]
V := (3=> 1.0, 4=> 1.0, 5 => 1.0, others => 2.0); -- [2]
V := (3 .. 5 => 1.0, others => 2.0); -- [3]
在上例[1]中,V(1)=V(2)=V(3)=1.0,V(4)=V(5)=2.0。
在上例[2]和[3]中,V(3)=V(4)=V(5)=1.0,V(1)=V(2)=2.0。
以下是一个2维数组的例子:
type Matrix (Integer range <>, Integer range <>) of Float;
M: Matrix(1..3, 0..2) :=
((1.0, 2.0, 1.0), (2=>1.0, 1=>0.5, 0=>0.0), (others => 0.0));
指名的聚合对数组(尤其是大型数组)的初始化提供了便利,同时也减少了出错的机会。