我对Ada很陌生,而且我很难弄清楚如何使用这些结构。当它们被转换成Ada时,下面的C结构会是什么样的?
这些是我的结构:
struct dataT
{
int m;
};
struct stack
{
int top;
struct dataT items[STACKSIZE];
} st;
这句话如何在Ada中表现出来?
st.items[st.top].m
答案 0 :(得分:6)
This answer与您的C代码完全等效,但(假设您没有与现有的C代码接口),您可以在Ada中做些事情,以便以后更轻松。
您可能想要创建不同大小的堆栈;由(全局?)宏STACKSIZE
确定其大小可以防止这种情况发生。为此,您可以使用歧视类型(请参阅本章末尾的ARM 3.7;示例,与Ada参考手册中一样):
type Stack (Size : Natural) is record
如果初始化Top
以指示堆栈为空,那将是件好事:
Top : Natural := 0;
然后能够直接声明数组,这将是伟大的,但不是Ada,
Items : array (1 .. Size) of Data_T;
但编译器说anonymous arrays not allowed as components
。相反,您必须为数组声明一个辅助类型,即unconstrained:
type Data_T_Array is array (Positive range <>) of Data_T;
然后你可以声明
Items : Data_T_Array (1 .. Size);
(注意,使用1 .. Size
以便具有正确的Size
元素,而不是使用从零开始的索引的C声明。
把它放在一起,你有
type Stack (Size : Natural) is record
Top : Natural := 0;
Items : Data_T_Array (1 .. Size);
end record;
您可以通过指定所需的大小来创建实例:
St : Stack (42);
或更明确地说,
St : Stack (Size => 42);
一个好处是你可以声明一个大小为零的堆栈。您可能认为其Items
是非法的(实际上,它会有索引1 .. 0
,而0
不是Positive
的合法值);但是,这是一种声明零长度数组的有效方法。
用法可以是,例如,
St.Top := St.Top + 1;
St.Items (St.Top).M := 1066;
答案 1 :(得分:3)
结构等同于记录,因此您的代码看起来像......
type dataT_type is
record
m : integer; -- or Interfaces.C.Int, depending on what you are doing
end record;
dataT : dataT_type;
type dataT_Array is array(1..STACKSIZE) of dataT_type;
type st_type is
record
top : integer;
items : dataT_Array;
end record;
st : st_type;
除了使用圆括号外,访问该变量看起来相同。
st.items(st.top).m