2013-04-24 93 views
2

基本上,我有2个文件(.adb和.ads)。我对Ada是全新的,也是如何编译2个文件的。该程序是一个基本的堆栈实现。编译.adb文件时出现此编译错误。Ada初学者堆栈程序

$ 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

好了,我不克设置错误,但我怎样才能让它运行我的test_adt_stack.adb文件? 我编译了,接下来应该运行什么? – thestralFeather7 2013-04-24 07:16:31

+1

'gnatmake test_adt_stack.adb'应该尽一切努力构建一个可执行文件:查看文件夹内容。包括跟踪和自动构建所有的依赖关系(不需要Makefile)要运行它,./test_stack应该做到这一点(如果你在Linux上,通常不是路径的一部分)。当然有一些方法可以将所有中间的.o文件在某处更加整齐,一旦你掌握了基本知识...... – 2013-04-24 08:26:40

+0

Brian,novice7 - 在基于Unix的系统上应该是'。/ test_adt_stack',或者在Windows上只是'test_adt_stack'(也许是'。\ test_adt_stack') 。 – 2013-04-24 15:33:00