在Ada中使用指针访问值

在Ada中使用指针访问值,ada,abstract-data-type,Ada,Abstract Data Type,我对Ada有点陌生,对这种语言的语法有一些困难 我已经实现了一个堆栈,例如,为了向它推送一个值,我需要使用一个函数push(stack\u instance,value) 我需要许多这样的堆栈实例,而不是固定大小的。所以我想使用指向堆栈的指针,每当我需要堆栈对象时,它都会创建新的堆栈对象 现在,我的问题是,在创建指向新堆栈的堆栈指针之后,如何将值推送到该堆栈实例?我不能使用Push(Stack,value),因为Push函数需要类型Stack,我有Ptr\u Stack。例如,在C中,我们有*p

我对Ada有点陌生,对这种语言的语法有一些困难

我已经实现了一个堆栈,例如,为了向它推送一个值,我需要使用一个函数
push(stack\u instance,value)

我需要许多这样的堆栈实例,而不是固定大小的。所以我想使用指向堆栈的指针,每当我需要堆栈对象时,它都会创建新的堆栈对象

现在,我的问题是,在创建指向新堆栈的堆栈指针之后,如何将值推送到该堆栈实例?我不能使用
Push(Stack,value)
,因为
Push
函数需要类型
Stack
,我有
Ptr\u Stack
。例如,在C中,我们有
*ptr
,通过它我们可以访问值,但在Ada中是否有类似的内容?

您可以:

Push (Stack.all, Value);
如果您使用的是Ada 2005或更高版本,并且您的堆栈类型是标记类型,那么您也可以使用稍微友好一些的:

Stack.Push (Value);
最后,您还可以更改Push的声明以接受指向堆栈的指针,如中所示:

procedure Push (Stack : not null access Stack_Type; Value : ...);
Push (Stack, Value);
您可以执行以下任一操作:

Push (Stack.all, Value);
如果您使用的是Ada 2005或更高版本,并且您的堆栈类型是标记类型,那么您也可以使用稍微友好一些的:

Stack.Push (Value);
最后,您还可以更改Push的声明以接受指向堆栈的指针,如中所示:

procedure Push (Stack : not null access Stack_Type; Value : ...);
Push (Stack, Value);

关于Ada和访问类型的一般建议是:在包中隐藏您对访问类型的使用。避免让软件包的用户不得不考虑内存管理。关于Ada和访问类型的更多建议:除非必须,否则不要使用它们!您可以将
堆栈
作为
输入输出
参数传递;像C++引用一样。通常关于艾达和Access类型的建议:隐藏你在包内使用访问类型。避免让软件包的用户不得不考虑内存管理。关于Ada和访问类型的更多建议:除非必须,否则不要使用它们!您可以将
堆栈
作为
输入输出
参数传递;类似C++的参考。