Ada功能,访问堆栈

时间:2017-11-03 04:31:16

标签: ada

Ada很新,这是我第一次用它编码。很丢失。任何提示和方向都会很棒。

Ada问题:

我正在尝试:函数Top (S : Stack) return Item_Type,它返回堆栈顶部项目或将Underflow异常引发到通用无界堆栈包。

我为此添加的功能位于此代码块的底部。 目前的错误: 在表达式或调用中无效使用子类型标记 “From”的实际值必须是变量 在表达式中无效使用子类型标记或调用

package body Unbound_Stack is

   type Cell is record
      Item : Item_Type;
      Next : Stack;
   end record;

   procedure Push (Item : in Item_Type; Onto : in out Stack) is
   begin
      Onto := new Cell'(Item => Item, Next => Onto);  -- '
   end Push;


   procedure Pop (Item : out Item_Type; From : in out Stack) is
   begin
      if Is_Empty(From) then
         raise Underflow;
      else
         Item := From.Item;
         From := From.Next;
      end if;
   end Pop;

   function Is_Empty (S : Stack) return Boolean is
   begin
      return S = null;
   end Is_Empty;

   --added this code, and then had errors!

   function Top (S : Stack) return Item_Type is
   begin
      --Raise the underflow
      if Is_Empty(S) then
         raise Underflow;
      else
         --or return top item from the stack, call pop
         Pop (Item_Type, from => S);--I think I should pull from the stack w/pop
      end if;

      return Item_Type;
   end Top;

end Unbound_Stack;

2 个答案:

答案 0 :(得分:1)

您有两条引用此行的错误消息:

   Pop (Item_Type, from => S);--I think I should pull from the stack w/pop

第一个指向Item_Type并说“在表达式或调用中无效使用子类型标记”。

  • 这意味着您在不允许的地方使用类型的名称。子程序的实际参数永远不能是类型。您需要使用(取决于参数方向)实际参数的变量或表达式。

答案 1 :(得分:1)

您将类型(Item_Type)传入Pop。相反,您需要声明一个Item_Type类型的变量并使用它。

e.g。

function Top (S : Stack) return Item_Type is

   Popped_Item : Item_Type;

begin
   ...

然后调用Pop变为:

   Pop (Item => Popped_Item, From => S)