2015-10-31 3 views
0

Мне был предоставлен проект в uni, где мне нужно написать пакет ADA графика. Точки графика хранятся в массиве, ребра хранятся в матрице. (В матрице, если есть край между двумя точками, число в этом индексе - это вес/длина края)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; 

я получаю "Graf не видимые" и "подтип знак необходимости в этом контексте" ошибка в ADB файл.

Можете ли вы помочь мне исправить все это?

+2

Предположительно, у вас есть тип (или подтип), называемый «Graph», объявленный где-то еще, предположительно в другом пакете, да? Добавьте эту спецификацию пакета в Q. Также, оставив в стороне мудрость повторного использования имени типа для пакета, было бы полезно указать, какая строка в 'graph, adb' сообщает об ошибке. Я предполагаю, что объявление типа для «Графа» просто не видно, потому что для этого пакета нет предложения WITH или Use. –

+1

См. [Этот ответ] (http://stackoverflow.com/a/28557589/40851) для «метки подтипа». Кроме того, я бы рекомендовал вызывать пакет 'Graphs'; то вы можете добавить отсутствующий 'type Graph is ...' без путаницы. –

+0

Скопируйте и вставьте точное сообщение об ошибке в свой вопрос.Я предполагаю, что фактическое сообщение было «График не виден», а не «Граф не видимый». Незначительные орфографические ошибки, подобные этому, могут быть очень значительными. –

ответ

4

ОК, глядя на код, до сих пор, я думаю, вы можете быть спутать с Package в качестве замены для С ++ Class, в то время как на самом деле больше похоже на C++ Namespace а.

У C++ не было пространств имен, когда я впервые использовал его, но они являются таким хорошим организующим принципом, что позднее они прикрепили их. Напротив, пакеты были оригинальной частью Ada.

Теперь C++ Class а (или Struct или Union) отображались бы на Ada с Record. Если он стоит один, это может быть простая запись, но если она предназначена для наследования, она будет Tagged 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 для этого.

+0

@Simon: спасибо за редактирование ... –

+0

Брайан, это было очевидное изменение - также, я думаю, что 'Graph' должен содержать' EdgeMatrix', который должен быть ограничен (максимальным числом?) Точек и ребер и чтобы содержать текущее количество точек и ребер. –

+1

Я уверен, что он должен содержать EdgeMatrix, я просто хотел указать правильный способ организовать вещи. И я не хотел вдаваться в подробности калибровки матриц, хотя из того, что я вижу в дизайне, они, вероятно, лучше всего реализуются с использованием классов контейнеров. В противном случае существует четкая кривая обучения, включающая в себя либо дискриминированные записи, либо типы доступа вперед ... –

Смежные вопросы