Ada“需要子类型标记”

时间:2015-10-31 15:14:42

标签: visibility ada required subtype

我在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不可见”和“此上下文中需要的子类型标记”错误。

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

好的,到目前为止查看代码,我认为你可能会错误地将Package误认为是C ++ Class的替代品,而它更像是一个C ++ Namespace。< / p>

当我第一次使用它时,C ++没有命名空间,但它们是一个很好的组织原则,以后它会加以修饰。相比之下,包装是Ada的原始部分。

现在,C ++ Class(或StructUnion)将映射到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类。