我在uni获得了一个项目,我需要编写一个图形的ADA包。图形的点存储在一个数组中,边缘存储在一个矩阵中。(在矩阵中,如果两个点之间有一个边,则该索引处的数字是边的权重/长度)
所需的两个程序是NewPoint和NewEdge。
所需的三个功能是IsItaPoint,IsitAnEdge和print(矩阵和数组)。
我一周前开始学习ADA,我确信这是一段2分钟的代码。 我写了这个:
Graph.ads
package Graph is
function IsItAPoint (G: Graph;I: Integer) return Boolean;
function IsItAnEdge (G: Graph;I: Integer; J: Integer ) return Boolean;
procedure NewEdge (G: Graph;I: Integer; J: Integer; S: Integer);
procedure NewPoint(G: Graph;I: Integer);
type PointArray is array(Integer range <>) Of Integer;
type EdgeMatrix is array(Integer range <>,
Integer range <>) of INTEGER;
PointCount: Integer:=0;
end Graph;
Graph.adb
package body Graph is
procedure NewPoint(G: Graph;I: Integer) is
begin
G.PointCount:=G.PointCount+1;
G.PointArray(G.PointCount):=I;
end;
procedure NewEdge(G: Graph;I: Integer; J: Integer; S: Integer) is
begin
G.EdgeMatrix(I,J):=S;
end;
function IsItAPoint (G: Graph;I: Integer) return Boolean is
begin
for J in 1..100 loop
if (G.PointArray(J)=I) then return True; end if;
end loop;
return False;
end;
function IsItAnEdge (G: Graph;I: Integer; J: Integer ) return Boolean is
begin
return (G.EdgeMatrix(I,J)=Null);
end;
end Graph;
adb文件中出现“Graf不可见”和“此上下文中需要的子类型标记”错误。
你能帮我解决这个问题吗?
答案 0 :(得分:4)
好的,到目前为止查看代码,我认为你可能会错误地将Package
误认为是C ++ Class
的替代品,而它更像是一个C ++ Namespace
。< / p>
当我第一次使用它时,C ++没有命名空间,但它们是一个很好的组织原则,以后它会加以修饰。相比之下,包装是Ada的原始部分。
现在,C ++ Class
(或Struct
或Union
)将映射到Ada Record
。如果它是独立的,它可以是一个简单的记录,但如果它是可以继承的,它将是Tagged Record
。标记记录,允许继承,不是Ada-83的一部分,它是20年前在Ada-95中添加的。
典型的做法是将Record
及其所有外部可见操作包装在Package
中。
所以我认为你正在寻找类似的东西:
package Graph_Pkg is
type Graph is tagged private; -- hide everything about the actual record!
function IsItAPoint (G: Graph;I: Integer) return Boolean;
function IsItAnEdge (G: Graph;I: Integer; J: Integer ) return Boolean;
procedure NewEdge (G: in out Graph;I: Integer; J: Integer; S: Integer);
procedure NewPoint(G: in out Graph;I: Integer);
-- PointCount: Integer:=0; -- moved to package body
function PointCount return Integer;
private
-- Everything below here is hidden from package users
type PointArray is array(Integer range <>) Of Integer;
type EdgeMatrix is array(Integer range <>,
Integer range <>) of INTEGER;
type Graph is tagged record
-- here the member variables are declared
Points : PointArray;
end record;
end Graph_Pkg;
现在所有的实现细节都属于正文。
package body Graph_Pkg is
-- The equivalent of C++ "static members" can be declared here
PointCount: Integer:=0;
-- and add the subprogram implementations here
end Graph_Pkg;
如果您希望在构建图形后图形中的点数可变,我可以在实现中看到前面的问题。您可能希望查看Ada-2005 Container类。