Программа стека для начинающих на Аде

По сути, у меня есть 2 файла (.adb и .ads). Я совершенно новичок в Аде, а также в том, как скомпилировать 2 файла. Программа имеет базовую реализацию стека. Я получил эту ошибку компиляции, когда скомпилировал файл .adb.

$ gcc -c test_adt_stack.adb
abstract_char_stack.ads:22:01: end of file expected, file can have only one compilation unit

У меня есть два файла: abstract_char_stack.ads.

-----------------------------------------------------------
package Abstract_Char_Stack is
  type Stack_Type is private;
  procedure Push(Stack : in out Stack_Type;
                 Item  : in Character);
  procedure Pop (Stack : in out Stack_Type;
                 Char  : out Character);
private
  type Space_Type is array(1..8) of Character;
  type Stack_Type is record
    Space : Space_Type;
    Index : Natural := 0;
  end record;
end Abstract_Char_Stack;
-----------------------------------------------------------
package body Abstract_Char_Stack is
----------------------------------------------
  procedure Push(Stack : in out Stack_Type;
                  Item : in Character) is
  begin
    Stack.Index := Stack.Index + 1;
    Stack.Space(Stack.Index) := Item;
  end Push;
--------------------------------------------
  procedure Pop (Stack : in out Stack_Type;
                 Char  : out Character) is
  begin
    Char := Stack.Space(Stack.Index);
    Stack.Index := Stack.Index - 1;
  end Pop;
--------------------------------------------
end Abstract_Char_Stack;

а другой — test_adt_stack.adb

-----------------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;
with Abstract_Char_Stack; use Abstract_Char_Stack;
procedure Test_ADT_Stack is
  S1 : Stack_Type;
  S2 : Stack_Type;
  Ch : Character;
begin
  Push(S1,'H'); Push(S1,'E');  
  Push(S1,'L'); Push(S1,'L');
  Push(S1,'O');                          -- S1 holds O,L,L,E,H

  for I in 1..5 loop
    Pop(S1, Ch);  
    Put(Ch);                             -- displays OLLEH
    Push(S2,Ch); 
  end loop;                              -- S2 holds H,E,L,L,O

  New_Line;
  Put_Line("Order is reversed");

  for I in 1..5 loop
    Pop(S2, Ch);
    Put(Ch);                             -- displays HELLO
  end loop;

end Test_ADT_Stack;
-----------------------------------------------------------

Что я делаю не так? Я просто хочу, чтобы он скомпилировался и отобразил то, что он должен делать. Это было задание типа изучения программы. Но я не могу его скомпилировать или не знаю, правильно ли я это делаю.


person thestralFeather7    schedule 24.04.2013    source источник


Ответы (1)


Проблема в том, что GNAT [и FSF GNAT — это то, что использует GCC, IIRC] не позволяет использовать несколько единиц компиляции в одном файле. (Это связано с тем, как они управляют библиотекой, но, возможно, это слишком подробно для новичка, чтобы беспокоиться об этом.)

Решение, для каждого из них нужен свой файл:

  • Спецификация Abstract_Char_Stack (abstract_char_stack.ads)
  • Тело стека Abstract_Char_Stack (abstract_char_stack.adb)
  • Тело Test_ADT_Stack [процедуры] (test_adt_stack.adb)
person Shark8    schedule 24.04.2013
comment
Итак, я не получаю ошибку, но как я могу запустить мой файл test_adt_stack.adb? Я скомпилировал, что мне дальше запускать? - person thestralFeather7; 24.04.2013
comment
gnatmake test_adt_stack.adb должен сделать все, чтобы создать исполняемый файл: просмотрите содержимое папки. Включая отслеживание и автоматическое построение всех зависимостей (файл Makefile не требуется!). Для его запуска должен выполняться ./test_stack (если вы работаете в Linux, где . обычно не является частью пути). Конечно, есть способы поместить все промежуточные файлы .o где-нибудь поаккуратнее, когда у вас есть основы... - person user_1818839; 24.04.2013
comment
Брайан, новичок7 — это должно быть ./test_adt_stack в системах на базе Unix или просто test_adt_stack (может быть, .\test_adt_stack) в Windows. - person Simon Wright; 24.04.2013
comment
извинения за испорченное имя исполняемого файла! - person user_1818839; 25.04.2013