基本上我正在尝试堆叠一条记录(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;
这就是我所有这些符号的原因。但它正在读取文件,我只是不知道为什么我得到了糟糕的输出。
答案 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));