1
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
with Ada.Numerics; use Ada.Numerics;

procedure AdaO11 is
    procedure Calculate_Angles (Sa, Hc,    : in  Float; 
                                Va, Vb, Vc : out Float) is 
    begin 
        Va := Arcsin(Sa / Hc);
        Vb := Arccos(Sa / Hc);
        Vc := 90.0;
    end Calculate_Angles;
  
    procedure Angle_Program is 
        Hc, Sa : Integer;
        Va : Float;
    begin
        Put("Type in the length of the hypotenuse: ");
        Get(Hc);
        Put("Type in the opposite catheus: ");
        Get(Sa);
        New_Line;
        Put("Va: ");
        Put(Calculate_Angles(Va));
    end Angle_Program; 
      
    Selection : Integer; 
begin      
    Put_Line("Welcome to the calculator!")
end AdaO11;

所以,我想知道为什么我在尝试计算角度时会出错。我做错什么了吗?我真的没有看到这个错误。我调用 2 个参数,然后发出 3 个。错误可能在我的代码的那部分。

任何帮助,将不胜感激。

4

1 回答 1

3

我调用 2 个参数,然后发送 3 个。

是的,您命名的子程序Calculate_Angles有五个形式参数,两个带有 modein和三个带有 mode out

错误可能在我的代码的那部分。

不,问题是你在哪里调用子程序Angle_Program

  1. Calculate_Angles是 a procedure,而不是 a function,所以没有结果Put可供使用。

  2. 您必须在调用中提供实际变量,并且它们必须在数量和类型上与形式参数匹配。因此Angle_Program需要五个变量——两个来自用户,三个用于保存Calculate_Angles.

procedure Angle_Program is

   Hc, Sa     : Float;
   Va, Vb, Vc : Float;
begin
    …
    Calculate_Angles (Sa, Hc, Va, Vb, Vc);
    …
end;

顺便说一句,三角函数Elementary Functions使用弧度。要匹配您的Vc值,请指定一个合适的Cycle参数来获取度数:

Va := Arcsin (Sa / Hc, 360.0);
Vb := Arccos (Sa / Hc, 360.0);

与此计算器进行比较的典型输出可能如下所示:

Type in the length of the hypotenuse: 5
Type in the opposite cathetus: 3

Va: 36.8699
Vb: 53.1301
Vc: 90.0000

我担心的是预期的标识符。

鉴于这种,

procedure Calculate_Angles (Sa, Hc,    : in  Float;…
                                  ^ 

正如@Jesper评论,相应的错误信息是这样的:

 ada011.adb:17:39: identifier expected

这是因为第 17 行第 39 行的错误——一个虚假的逗号。当您声明子程序的参数规范时,编译器合理地期望定义标识符列表在逗号之后有另一个定义标识符。

于 2021-10-01T19:10:07.670 回答