Ada 艾达:为什么我的队列只容纳它;循环中的s值?

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,

所以我用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, 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。该计划已全面实施。