0

请看下面的代码

公式.ads

package Formula is
   procedure CalculateFormula;
end 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)

我对艾达很陌生。几个小时前开始编码。请帮助我摆脱上述问题。谢谢你。

编辑

公式.gpr

project Formula is

   for Main use ("formula.ads");

end Formula;
4

2 回答 2

2

GPR 文件显示您正在尝试将包规范用作主程序单元 - 这不起作用。

解决这个问题的两种方法:最简单的一种是在文件“calculateformula.adb”中使“CalculateFormula”成为一个独立的主程序,并将其设置在您的项目文件中:

for Main use ("calculateformula.adb");

但是,如果您想了解包是如何工作的,有一种“更好”的方法(因为它可以让您了解包的用途以及它们的使用方式......)

包是可重用的组件:包规范是您使用它们所需的全部内容......但实际上您在另一个程序中使用它们。所以在这种情况下,您将创建一个主程序

with Formula; use Formula;

    procedure MyMain is
    begin
       CalculateFormula;
    end MyMain;

在 .gpr 文件中,

for Main use ("mymain.adb");

然后编译器会自动编译正确的包并找到 Shark 指出的其他问题。

正如“hello world”示例所示,您在这里真的不需要单独的 Main。然而,这种琐碎的“主子程序”(用正确的 Ada 术语来说)并不罕见,尤其是对于稍后在更复杂的应用程序中使用的单元测试包之类的目的。

于 2013-04-05T22:09:04.683 回答
0

这令人费解,因为编译器应该标记一些大错误,例如:

package fom_io is new Ada.Float_Text_IO(Float);

这不是withed,并且

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;

这更正了您遇到的语法错误。另一个答案似乎是正确的,因为这个 ["cannot generate code for" 错误] 似乎是 gpr 文件而不是源本身的问题。

于 2013-04-05T22:10:17.843 回答