代码之家  ›  专栏  ›  技术社区  ›  yCalleecharan

Ada:声明性部分、函数和包

  •  1
  • yCalleecharan  · 技术社区  · 16 年前

    包装规格:

    package Compute_Jacobian is
    
    --compute X1
    function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float;
    
    --- use X1 in J21
    function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float;
    
    end Compute_Jacobian;
    

    包体为:

    package body Compute_Jacobian is
     --compute X1
    
    function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float is separate;
    
    X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
    
    
    function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float is separate;
    
    end Compute_Jacobian;
    

    我已经为computex1和J21创建了存根。

    关于包体计算的编译_雅可比.adb,我收到以下错误消息:

    12.    X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
           |
        >>> statement not allowed in declarative part
    

    我的问题是如何计算X1并将其用于计算函数J21。

    谢谢。。。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    你在试着 执行 代码区域中只允许 声明 .

    至少我没有看到您的X1声明(尽管这可能是因为您没有在上面的代码中摘录它),也没有看到被分配给Force_Applied和Forcing_Frequency的声明和值。

    可以对其进行修正,使其编译时接近原样:

    X1 : Long_Float := Compute_X1 ( Force_Applied, Forcing_Frequency);
    

    package body Computer_Jacobian is
        ...
        X1 : Long_Float;
        ...
    begin
       X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
    end Compute_Jacobian;
    

    但老实说,我真的不认为这两个都是你真正想要的。

    在主程序中,您可以只声明X1(变量作为参数传递),然后调用计算函数,例如(警告,未编译)

    with Compute_Jacobian;
    procedure Do_Computations is
    
      Force_Applied     : Long_Float := 1.0;
      Forcing_Frequency : Long_Float := 10.0;
      Natural_Frequency : Long_Float := 5.0;
    
      X1  : Long_Float;
      J21 : Long_Float;
    
    begin
       X1  := Compute_Jacobian.Compute_X1 (Force_Applied, Forcing_Frequency);
       J21 := Compute_Jacobian.Compute_J21 (X1, Forcing_Frequency, Natural_Frequency);
    end Do_Computations;
    

    这是一种获得你想要的东西的方法。

    或者,如果X1仅在Compute\u J21中使用,则应调用Compute\u X1作为该函数中执行的第一个语句之一(或作为X1声明的初始化)(并传递Force\u Applied,而不是X1,作为Compute\u J21的参数):

    function Compute_J21 (Force_Applied, 
                          Forcing_Frequency,
                          Natural_Frequency : Long_Float)
                                       return Long_Float is
    
       -- Declarations...
       X1 : Long_Float := Compute_X1(Force_Applied, Forcing_Frequency);
    
    begin
       -- Computations that utilize X1...
    
    end Compute_J21;
    

    还有一个关于“是分开的”。。。我理解将这些函数实现分开的冲动,因为它们很复杂,但我仍然建议不要这样做。它只是添加了另一个要跟踪的文件,如果您使用GNAT,那么您只需单独编译它们就不会获得任何性能提升,因为整个包体最终都会得到处理,而使用“is separate”在主流Ada编程中是非常少见的。这个 answer 在你之前问的一个问题中谈到了这一点。