2013-04-05 33 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