Ada - 堆叠记录?

时间:2011-11-27 00:45:33

标签: ada

基本上我正在尝试堆叠一条记录(1条记录是2个字符串变量,其中有3条但是我想暂时堆叠至少1条)。我认为我的算法设置会像这样:

客户端:为记录中的字符串赋予值,调用堆栈的过程(即推送,弹出,显示) 包:声明记录,将项目推送/弹出到堆栈,显示堆栈。

我总体上遇到了麻烦。我试着把它全部保留在当地。它确实打开文件并读入字符串(尝试读取整数值,工作正常),这已经在客户端程序中使用类似的设置进行了测试(而不是记录我将它存储到长度为40的字符串)。然而,当我要输出它时,我得到的是一堆随机符号(例如╤cß≈Ä),没有像文件所包含的单词。

以下是我的代码片段:

包装规格:

StackMaximum: constant integer := 10;
   TYPE StackItem IS Record
str1: string (1..20);
str2: string (1..20);
 end record;

   type Stack is PRIVATE

    PROCEDURE Push (Item: IN StackItem; AStack: IN OUT Stack);
    PROCEDURE display (AStack : in Stack);

包体:

procedure Push (Item: in StackItem;
            AStack: in out Stack) is
begin
 if AStack.Top < StackMaximum then
     AStack.Top := AStack.Top + 1;
     AStack.Store(AStack.Top) := Item;
 else
     raise StackOverflow;
 end if;
END Push;

    procedure display(AStack: in stack) is
  BEGIN

     FOR I IN 1..AStack.Top LOOP
        Put(AStack.Store(I.lastname));
     END LOOP;
  END display;

    PRIVATE
    type int_arry is array (1..StackMaximum) of StackItem;
    type Stack is record
        Store: int_arry;
        Top: integer range 0..StackMaximum;
    END RECORD;

客户端:

Lt:           Integer;
New_Stack2:    Stack;
A:            StackItem;
Stackitems:   Ada.Text_IO.File_Type;

   Get_Line(File => Stackitems, Item => A.str1, Last => Lt);
   Get_Line(File => Stackitems, Item => A.str2, Last => Lt);

   Push(A, New_Stack1);
   display(New_Stack1);

文件(仅包含“This..var。”):

This is the test input for the file var.

对于我对这部分做错的任何建议?这也是我的另一个设置,我把它保存在本地:

客户端:

Lt:           Integer;
AB:           String(1..40);
New_Stack2:    Stack;
A:            StackItem;
Stackitems:   Ada.Text_IO.File_Type;

begin

   Get_Line(File => Stackitems, Item => AB, Last => Lt);

   Put(item=> AB);

end;

这就是我所有这些符号的原因。但它正在读取文件,我只是不知道为什么我得到了糟糕的输出。

2 个答案:

答案 0 :(得分:1)

也许在您对type Stack的定义中,您应该将Top初始化为0?

type Stack is record
   Store: int_arry;
   Top: Integer range 0 .. StackMaximum := 0;
end record;;

答案 1 :(得分:0)

如果对可能比定义的变量更短的内容使用Get(或Get_Line),则必须存储长度。

您已使用变量Lt。现在,您必须在Put来电中限制变量:Put(item => AB(1 .. Lt));