Ada 艾达:为什么我的队列只容纳它;循环中的s值?
所以我用Gnat编译器编译Ada。我有一个队列,它保存着一条记录,其中一个记录变量是一个名为name的无界_字符串。这就是我现在正在测试的,尽管所有记录变量都应该可以在循环之外访问。我遇到问题的代码是Ada 艾达:为什么我的队列只容纳它;循环中的s值?,ada,Ada,所以我用Gnat编译器编译Ada。我有一个队列,它保存着一条记录,其中一个记录变量是一个名为name的无界_字符串。这就是我现在正在测试的,尽管所有记录变量都应该可以在循环之外访问。我遇到问题的代码是 with ada.text_io, stacks, queues, ada.Strings.Unbounded, ada.Strings.Unbounded.Text_IO, ada.Integer_Text_IO; use ada.Text_IO, ada.Strings.Unbounded,
with ada.text_io, stacks, queues, ada.Strings.Unbounded, ada.Strings.Unbounded.Text_IO, ada.Integer_Text_IO;
use ada.Text_IO, ada.Strings.Unbounded, ada.Strings.Unbounded.Text_IO, ada.Integer_Text_IO;
procedure eliminate is
type person is record
index: Positive;
age: Positive;
skill: natural;
wins: natural;
loss: natural;
name: Unbounded_String;
end record;
package stkPkg is new stacks(person);
use stkPkg;
output: Stack;
package quePkg is new Queues(person);
use quePkg;
noLossQ : Queue;
count : Positive := 1;
input : Person;
begin
while not end_of_file loop
input.name := get_line;
get(input.skill);
get(input.age);
skip_line;
input.index := count;
count := count + 1;
input.wins := 0;
input.loss := 0;
enqueue(input, noLossQ);
put_line(front(noLossQ).name);
end loop;
put_line(front(noLossQ).name);
end eliminate;
如果您运行它,您会注意到在循环内部put_line(front(noLossQ).name)工作得很好,但是一旦超出循环,它就什么也不做,或者打印一个空行。循环结束,put_线工作,循环结束,然后put_线不工作;代码如下
enqueue(input, noLossQ);
put_line(front(noLossQ).name);
end loop;
put_line(front(noLossQ).name);
这是我的队列实现
with Unchecked_Deallocation, ada.Text_IO;
use ada.Text_IO;
package body queues is
function is_Empty (Q: Queue) return Boolean is
begin
return ((Q.front = null) and (Q.back = null));
end is_Empty;
procedure Dequeue (Q : in out Queue) is
begin
if is_Empty(Q) then
raise Queue_Empty;
else
Q.Back := Q.Back.Next;
if Q.Back = null then
Q.Front := null;
end if;
end if;
end Dequeue;
procedure Enqueue (Item: ItemType; Q: in out Queue) is
tmp : QueueNodePointer := new QueueNode'(Item, null);
begin
if is_Full(q) then
raise Queue_Full;
else
if Q.Back = Null then
Q.Back := tmp;
end if;
if Q.Front /= null then
q.front.next := tmp;
end if;
q.Front := tmp;
end if;
end Enqueue;
function Front (Q: Queue) return ItemType is
begin
if is_Empty(Q) then
raise Queue_Empty;
else
return Q.back.data;
end if;
end Front;
end queues;
我正在使用的重定向文件:
Person one
500 50
Person 2
400 50
Person 3
300 50
Person 4
200 50
Person 5
100 50
我不明白为什么它只在循环中起作用,感谢您的帮助。提前谢谢 问题似乎一定出在队列实现中。您应该正确地测试它,以确保它具有您期望的属性。您从哪里获得输入?文件或控制台?确保您的程序没有引发结束错误异常。无法运行它,因为您没有包含
队列。ads
。另外,Front
返回Q.back.data
,这至少是最容易混淆的!很抱歉回复太晚,但我正在从一个文本文件重定向,我会将该文件添加到上面的原始帖子中。你真的需要包含queues.ads。该计划已全面实施。