无法生成文件代码

时间:2013-04-05 21:52:51

标签: oop gcc real-time ada gnat

请查看以下代码

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)

我是阿达的新手。几小时后开始编码。请帮我摆脱上述问题。谢谢。

修改

formula.gpr

project Formula is

   for Main use ("formula.ads");

end Formula;

2 个答案:

答案 0 :(得分: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");

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

你真的不需要一个单独的Main,就像“你好世界”的例子所示。然而,这些微不足道的“主要子程序”(在正确的Ada术语中)并不是那么不寻常,特别是对于像以后在更复杂的应用程序中使用的单元测试包这样的目的。

答案 1 :(得分:0)

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

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)无效乘法。
  3. 此外,在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文件的问题,而不是源本身。