2013-04-05 58 views
0

請看看下面的代碼不能用於文件

Formula.ads

package Formula is 
    procedure CalculateFormula; 
end Formula; 

Formula.adb

with Ada.Text_IO; use Ada.Text_IO; 
with Formula; use Formula; 

package body Formula is 
    procedure CalculateFormula is 

     package fom_io is new Ada.Float_Text_IO(Float); 
     use fom_io; 

     u : Float; 
     t : Float; 
     a : Float; 
     answer : Float; 

    begin 
     put_line("Enter 'U'"); 
     get(u); 

     put_line("Enter 'T'"); 
     get(t); 

     put_line("Enter 'A'"); 
     get(a); 

     answer = (u*t)+ 0.5(a(t*t)); 

     put("Answer is: "); 
     put(answer,Fore => 1,Aft => 1,Exp => 1); 
    end CalclualeFormula; 
end Formula; 

當我運行這段代碼生成代碼,我收到以下錯誤

gnatmake -d -PC:\Users\yohan\Documents\Ada\Formula\formula.gpr 
gcc -c -I- -gnatA C:\Users\yohan\Documents\Ada\Formula\formula.ads 
cannot generate code for file formula.ads (package spec) 
gnatmake: "C:\Users\yohan\Documents\Ada\Formula\formula.ads" compilation error 

[2013-04-06 03:18:22] process exited with status 4 (elapsed time: 00.22s) 

我對Ada很新。開始編碼幾個小時後。請幫我擺脫上述問題。謝謝。

編輯

formula.gpr

project Formula is 

    for Main use ("formula.ads"); 

end Formula; 
+1

我想我們需要看你的.gpr文件。但有幾點:包體不需要「與」它自己的規範。雖然你可以編譯一個.ads文件(spec)來檢查語法,但是你不能從它生成代碼,這就是msg發出的錯誤信息。通常情況下,您只需編譯主程序單元,並且所有必要的軟件包編譯都是自動完成的。 – 2013-04-05 21:56:15

+0

@BrianDrummond:謝謝你的回覆。請參閱編輯 – 2013-04-05 22:02:50

+0

@BrianDrummond:感謝您的回覆。請參閱編輯 – 2013-04-05 22:08:03

回答

2

的GPR文件顯示你正在試圖用一個包規範作爲主要程序單元 - 這是行不通的。

兩種方式來解決這個問題:最簡單的一種是讓「CalculateFormula」一個獨立的主程序文件「calculateformula.adb」,並設置這個項目中的文件:

for Main use ("calculateformula.adb"); 

但是,如果你想看看軟件包是如何工作的,有一種「更好」的方式(因爲它可以讓你瞭解軟件包的作用和使用方式......)

軟件包是可重複使用的組件:軟件包規格是你需要的看到爲了使用它們......但你實際上在另一個程序中使用它們。因此,在這種情況下,你將創建一個主程序

with Formula; use Formula; 

    procedure MyMain is 
    begin 
     CalculateFormula; 
    end MyMain; 

,並在.gpr後文件,

for Main use ("mymain.adb"); 

然後編譯器會自動編譯正確的包,發現鯊魚已經指出的其他問題出。

你真的不需要單獨的Main,就像「hello world」示例所示。然而,這些微不足道的「主要子程序」(使用正確的Ada術語)並不是那麼不尋常,特別是對於稍後在更復雜的應用程序中使用單元測試程序包等目的。

+0

對於Ada代碼,堅持使用小寫文件名更好。 Windows並不關心,Mac OS X可能會感到困惑,而其他的Unix系統非常需要它(你可以使用GPR'package Naming'工作,但爲什麼要這麼做?) – 2013-04-06 07:57:52

+0

同意小寫的文件名:編輯。 Linux是區分大小寫的,但有些工具會轉換爲小寫(可能會使Windows保持高興),從而導致不匹配。 – 2013-04-06 09:23:13

+0

哇。非常感謝您的幫助! – 2013-04-06 12:52:28

1

這是令人費解,因爲有一些大的錯誤,編譯器應該是標記,如:

package fom_io is new Ada.Float_Text_IO(Float); 

這是不with ED和

answer = (u*t)+ 0.5(a(t*t)); 

因爲:

  1. =不是賦值運算符;您需要:=
  2. 0.5(XXXX)無效乘法。

另外,在Ada中有指數運算,因此t ** 2可以代替t * t。


formula.adb

with 
Ada.Float_Text_IO, 
Ada.Text_IO; 

use 
Ada.Text_IO; 

package body Formula is 
    procedure CalculateFormula is 

     use Ada.Float_Text_IO; 

     u, t, a, answer : Float; 

    Procedure Prompt(Item : out Float; Name : String) is 
    begin 
     put_line("Enter '"& Name &"'"); 
     get(Item); 
    end prompt; 
    begin 

    prompt(u, "U"); 
    prompt(t, "T"); 
    prompt(a, "A"); 

     answer:= (u*t) + 0.5*(a*t**2); 

     put("Answer is: "); 
     put(answer,Fore => 1,Aft => 1,Exp => 1); 
     New_Line; 
    end CalculateFormula; 
end Formula; 

這糾正你有語法錯誤。另一個答案似乎是正確的,因爲[「不能生成代碼」錯誤]似乎是gpr文件的問題,而不是源本身。

+0

在這之前編譯器已經退出... – egilhh 2013-04-05 22:15:20

+0

是的,但仍然很奇怪,他們沒有任何關於它們的信息......雖然在進一步的檢查中,這似乎是一個錯誤消息的錯誤[儘管Ada總體趨向於有幫助的消息]它似乎在說「這個規範文件不能用於創建一個可執行文件/對象[生成代碼]」...在某些情況下,spec可以產生一個對象(純/枚舉,IIRC)。 – Shark8 2013-04-05 22:32:23

+0

@ Shark8:一個規範可以生成一個對象*,前提是*它不需要body;這個呢。我同意,在理想的世界中'gnatmake'會告訴我們一個軟件包規範不能成爲主要的程序。 – 2013-04-06 07:52:49