Ада - Сложенные записи? - PullRequest
       5

Ада - Сложенные записи?

0 голосов
/ 27 ноября 2011

По сути, я пытаюсь составить запись (1 запись - это 2 строковые переменные, и их 3, но я бы хотел на время собрать хотя бы 1). Я думаю, что установка хотела бы что-то вроде этого для моего алгоритма:

Клиент: Значения задаются для строк в записи, вызываются процедуры для стека (т. Е. Push, pop, display) Пакет: Запись объявлена, элементы помещены в стек, отображены в стеке.

У меня вообще проблемы. Я пытался держать все это локально. Он действительно открывает файл и читает в строках (пробовал читать в целочисленном значении, работает нормально), это я протестировал в клиентской программе, используя аналогичную настройку (вместо записи я сохранил ее в строку длиной 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 ]

1 голос
/ 27 ноября 2011

Возможно, в вашем определении type Stack вы должны инициализировать Top в 0?

type Stack is record
   Store: int_arry;
   Top: Integer range 0 .. StackMaximum := 0;
end record;;
0 голосов
/ 28 ноября 2011

Если вы используете Get (или Get_Line) для чего-то, что может быть короче, чем определенная переменная, вы должны сохранить длину.

Для этого вы уже используете переменную Lt,Теперь вам нужно ограничить переменную в вашем Put вызове: Put(item => AB(1 .. Lt));

...