2013-04-24 95 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