我想学习ADA并且在课堂上遇到问题'
我有2个A和B类,希望A类可以使用B类。 A类
with B;
package A is
type A is tagged
record
varA : INTEGER := 0;
varB : INTEGER := 0;
end record;
procedure DOSMTH(A_In : in out A; B_IN: in out B);
end A;
和B类
package B is
type B is tagged
record
var1 : INTEGER;
var2 : INTEGER;
end record;
procedure DoSMTH2(B_IN: in out B; var : INTEGER);
end B;
如果我想编译A,我收到以下错误消息:
此上下文中要求的子类型标记
宣布
发现' B'在b.ads:1
另一个问题是我的主要'不能使用A和B(声明)
的文件with Ada.Text_IO, A, B;
procedure Main is
a : A;
b : B;
begin
null;
end Main;
我得到以下错误:
对象" A"在声明结束前不能使用 对象" B"在声明结束之前不能使用
我找不到任何解决方案。我已阅读ADA 2005参考手册但无法找到任何内容。
好的thx寻求帮助, 最终它现在有效。
解决方案:
将A类修改为
with B;
package A is
type A is tagged
record
-- u can use a object VAR with
-- objB : B.B
varA : INTEGER := 0;
varB : INTEGER := 0;
end record;
procedure DOSMTH(A_In : in out A; B_IN: in out B.B);
end A
将Main修改为:
with Ada.Text_IO, A, B;
procedure Main is
myA : A.A; --the old one was stupid ...
myB : B.B; --same here
begin
null;
end Main;
答案 0 :(得分:4)
主程序的问题是Ada不区分大小写,所以当你说
时a : A.A;
编译器看到a : A
并认为第二个A与第一个A相同,因此投诉object "A" cannot be used before end of its declaration
。
您可以通过限定来告诉编译器在哪里查找包A
。软件包A
在库级声明,并且有一个名义包Standard
可用于表明:
a : Standard.A.A;
但是,如果可以的话,最好避免在不同的事情上使用相同的名称。
答案 1 :(得分:1)
您只在包A中使用了包B - 为了使用任何形式,您必须使用限定名称(即:对于记录B,您应该使用B.B)。喜欢:
with B;
package A is
type A is tagged
record
varA : INTEGER := 0;
varB : INTEGER := 0;
end record;
procedure DOSMTH(A_In : in out A; B_IN: in out B.B);
end A;
如果您想使用包B中声明的内容而没有完全符合条件的名称,您应该在使用use B;
之后立即使用它。
关于是否应该使用或仅使用包是一个难题 - 大多数时候我认识的大多数Ada程序员(包括我自己)更喜欢只使用包,很少使用它们 - 例如在使用Lumen库时(OpenGL)与glut-like功能绑定)我通常使用Lumen因为那时我可以输入GL.Whatever_GL_Function而不是Lumen.GL.Whatever_GL_Function(但我没有"使用" Lumen.GL)。如果包名称很长,我更喜欢在过程中重命名它,如果是类型(对于运算符,如果已定义),可以use type B.B;
PS:如果有些部分不清楚,我可以详细说明。
答案 2 :(得分:-1)
我的猜测是编译器将“B”视为包的名称而不是记录。尝试以不同方式命名您的包或记录。
此外,如果您想学习Ada,参考手册是您想要开始的最后一个地方。获得巴恩斯的书或获得亚马逊使用的旧书之一。你在二手的部分得到了关于Ada 95 5美元的好书。