2013-04-24 1 views
2

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

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

2 файла У меня есть следующие: 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; 
----------------------------------------------------------- 

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

ответ

7

Проблема в том, что 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)
+0

Хорошо, таким образом я не г etting ошибка, но как я могу заставить ее запустить файл test_adt_stack.adb? Я скомпилировал, что мне следует запустить дальше? – thestralFeather7

+1

'gnatmake test_adt_stack.adb' должен сделать все, чтобы создать исполняемый файл: посмотрите содержимое папки. Включая отслеживание и автоматическое построение всех зависимостей (не требуется Makefile!) Чтобы запустить его, нужно выполнить ./test_stack (если вы находитесь в Linux, где обычно не входит в путь). Конечно, есть способы поместить все промежуточные файлы .o где-то более аккуратные, как только у вас есть основы ... –

+0

Brian, novice7 - это должно быть './test_adt_stack' в системах на базе Unix или просто' test_adt_stack' (возможно, '. \ test_adt_stack') в Windows , –