如何将这个C结构转换成Ada

时间:2015-03-30 05:46:50

标签: c ada

我对Ada很陌生,而且我很难弄清楚如何使用这些结构。当它们被转换成Ada时,下面的C结构会是什么样的?

这些是我的结构:

struct dataT
{
    int m;
};

struct stack
{
    int top;
    struct dataT items[STACKSIZE];
} st;

这句话如何在Ada中表现出来?

st.items[st.top].m

2 个答案:

答案 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