我具有机械工程背景,但我有兴趣与 Ada 一起学习良好的软件工程实践。我有几个疑问。
Q1。如果我理解正确,那么有人可以编写一个包规范(广告)文件,编译它,然后编译使用该包的主程序。稍后,当一个人知道要在包体中包含什么时,就可以编写和编译后者。之后,现在可以运行主程序。我已经尝试过了,我想确认这是一个很好的做法。
Q2。我的第二个问题是关于存根(子单元)和 SEPARATE 的使用。假设我有一个主程序如下:
WITH Ada.Float_Text_IO;
WITH Ada.Text_IO;
WITH Ada.Integer_Text_IO;
PROCEDURE TEST2 IS
A,B : FLOAT;
N : INTEGER;
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS SEPARATE;
BEGIN -- main program
INPUT(A,B,N);
Ada.Float_Text_IO.Put(Item => A);
Ada.Text_IO.New_line;
Ada.Integer_Text_IO.Put(Item => N);
END TEST2;
然后我将过程 INPUT 放在一个单独的文件中:
separate(TEST2)
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
BEGIN
Ada.Float_Text_IO.Get(Item => A);
Ada.Text_IO.New_line;
Ada.Float_Text_IO.Get(Item => B);
Ada.Text_IO.New_line;
Ada.Integer_Text_IO.Get(Item => N);
END INPUT;
我的问题:
a) AdaGIDE 建议我将 INPUT 过程文件保存为 input.adb。但是在编译主程序 test2 时,我收到警告:
warning: subunit "TEST2.INPUT" in file "test2-input.adb" not found
cannot generate code for file test2.adb (missing subunits)
对于 AdaGIDE 来说,这更像是一个错误,因为上述警告出现在消息之前:
Compiling...
Done--error detected
所以我将 input.adb 文件重命名为 test2-input.adb,正如 AdaGIDE 在编译时向我建议的那样。现在在编译主文件时,我没有任何警告。我现在的问题是可以写吗
PROCEDURE INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
就像我在子单元文件 test2-input.adb 中所做的那样,还是写一个更具描述性的术语更好
PROCEDURE TEST2-INPUT(A,B: OUT FLOAT; N: OUT INTEGER) IS
强调程序输入有一个父程序 test2 ?这个想法来自 AdaGIDE 提示我关于 test2-input.adb ,正如我上面提到的。
b)我的下一个问题:
如果我理解编译顺序,那么我应该先编译主文件 test2.adb ,然后编译存根 test2-input.adb 。在编译存根时,我收到错误消息:
cannot generate code for file test2-input.adb (subunit)
Done--error detected
但是,我现在可以为 test2.adb 进行绑定和链接并运行程序。
我想知道我尝试编译存根 test2-input.adb 是否做错了,还是不应该编译?
Q3。有子单位有什么用?只是将一个大程序分解成更小的部分吗?我知道如果没有在子单元中的 BEGIN 和 END 之间放置任何语句,则会出现错误。所以这意味着人们总是必须在那里发表声明。如果以后想写语句,总是可以在子单元中的 BEGIN 和 END 之间放置一个 NULL 语句,稍后再回到后者。这就是软件工程在实践中的完成方式吗?
非常感谢...