declaration - 在ada中,常数声明

在这里,我试图设置一个变量Actual_Stiffness以保持恒定值,


Actual_Stiffness := Stiffness_Ratio * Stiffness_Total




WITH Ada.Text_IO;


WITH Ada.Long_Float_Text_IO;


WITH Material_Data;


USE Material_Data;



PROCEDURE sample IS



 Stiffness_Ratio : Long_Float;


 Actual_Stiffness : CONSTANT Long_Float := Stiffness_Ratio * Stiffness_Total;



BEGIN -- main program


 Ada.Text_IO.Put("Enter stiffness ratio:");


 Ada.Long_Float_Text_IO.Get(Item => Stiffness_Ratio);


 Ada.Long_Float_Text_IO.Put(Item => Stiffness_Ratio);



 --Ada.Text_IO.New_Line;


 --Ada.Long_Float_Text_IO.Put(Item => Actual_Stiffness);


 --Ada.Text_IO.New_Line;


 --Ada.Long_Float_Text_IO.Put(Item => Stiffness_Total);


END sample;



编译时收到警告消息

warning : " Stiffness_Ratio " may be referenced before it has a value

在运行程序时,Actual_Stiffness的值不正确,

我的疑问是:

我已经将Stiffness_Total定义为常数Long_Float ,如何将Actual_Stiffness定义为常数(因为它不会在程序中更改),同时又使用户能够交互地在终端上输入Stiffness_Ratio?

非常感谢。

时间:

在ada中,在函数中间声明变量是完全可能的,也是合理的,和c的语言的唯一区别是,为了做到这一点,必须显式定义范围,


declare


 A : My_Type := Val;


begin


 Use(A);


end;



这意味着在收到运行时值后,可以声明常数:


WITH Ada.Text_IO;


WITH Ada.Long_Float_Text_IO;


WITH Material_Data;


USE Material_Data;



PROCEDURE sample IS



 Stiffness_Ratio : Long_Float;



BEGIN -- main program


 Ada.Text_IO.Put("Enter stiffness ratio:");


 Ada.Long_Float_Text_IO.Get(Item => Stiffness_Ratio);


 Ada.Long_Float_Text_IO.Put(Item => Stiffness_Ratio);



 --Ada.Text_IO.New_Line;


 declare


 Actual_Stiffness : CONSTANT Long_Float := Stiffness_Ratio * Stiffness_Total;


 begin


 Ada.Long_Float_Text_IO.Put(Item => Actual_Stiffness);


 end;


 --Ada.Text_IO.New_Line;


 --Ada.Long_Float_Text_IO.Put(Item => Stiffness_Total);


END sample;



例如,Euclid的最大公约数算法的非递归实现:


 function GCD(X,Y : Integer) return Integer is


 begin


 declare


 X : Integer := GCD.X;


 Y : Integer := GCD.Y;


 begin


 while Y /= 0 loop


 declare


 temp : Integer := X;


 begin


 X := Y;


 Y := temp mod Y;


 end;


 end loop;


 return X;


 end;


 end GCD;



在gcd中,参数x和y始终为常量,因为它们被声明为in,这是为了避免混淆;


 function Sum(List: Cell_Ptr) return Integer is


 Local: Cell_Ptr := List;


 (...)



这使得程序员能够引用列表,常量和不变的初始值,

通过添加具有相同名称的变量的内部范围来隐藏x和y,意味着我们需要显式地将,


 Inner:


 declare


 X : Integer := 0;


 begin


 Use(Inner.X); -- explicitly the X in that scope


 end Inner;



...