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

Ben*_*jer -2 c ada

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

这些是我的结构:

struct dataT
{
    int m;
};

struct stack
{
    int top;
    struct dataT items[STACKSIZE];
} st;
Run Code Online (Sandbox Code Playgroud)

如何在Ada中表达这种说法?

st.items[st.top].m
Run Code Online (Sandbox Code Playgroud)

Sim*_*ght 6

这个答案与C代码完全相同,但(假设你没有与现有的C代码接口),你可以在Ada中做些让以后生活更轻松的事情.

您可能想要创建不同大小的堆栈; 由(全局?)宏确定它们的大小会STACKSIZE阻止这种情况.为此,您可以使用区分类型(参见ARM 3.7 ;本章末尾的示例,与Ada参考手册中一样):

type Stack (Size : Natural) is record
Run Code Online (Sandbox Code Playgroud)

如果Top初始化表明堆栈为空将是好的:

   Top : Natural := 0;
Run Code Online (Sandbox Code Playgroud)

能够然后直接声明数组,那将是伟大的,但不是Ada,

   Items : array (1 .. Size) of Data_T;
Run Code Online (Sandbox Code Playgroud)

但编译说anonymous arrays not allowed as components.相反,您必须为数组声明一个辅助类型,它不受约束:

type Data_T_Array is array (Positive range <>) of Data_T;
Run Code Online (Sandbox Code Playgroud)

然后你可以申报

   Items : Data_T_Array (1 .. Size);
Run Code Online (Sandbox Code Playgroud)

(注意,使用1 .. Size以便具有确切的Size元素,而不是使用从零开始的索引的C声明).

把它放在一起,你有

type Stack (Size : Natural) is record
   Top   : Natural := 0;
   Items : Data_T_Array (1 .. Size);
end record;
Run Code Online (Sandbox Code Playgroud)

并通过指定所需的大小来创建实例:

St : Stack (42);
Run Code Online (Sandbox Code Playgroud)

或者,更明确地说,通过

St : Stack (Size => 42);
Run Code Online (Sandbox Code Playgroud)

一个很好的点是你可以声明一个大小为零的堆栈.你可能认为它Items是非法的(实际上,它会有指数1 .. 0,而0不是合法价值Positive); 但是,这是一种声明零长度数组的有效方法.

例如,用法是

St.Top := St.Top + 1;
St.Items (St.Top).M := 1066;
Run Code Online (Sandbox Code Playgroud)


Dal*_*ugh 5

结构相当于记录,所以你的代码看起来像......

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;
Run Code Online (Sandbox Code Playgroud)

除了使用圆括号之外,访问变量看起来是相同的。

st.items(st.top).m
Run Code Online (Sandbox Code Playgroud)