2017-02-12 20 views
0

Я работаю над реализацией функции простого разложения в Ada. Мне нужно вернуть вектор от calc_prime_numbers. Я пытаюсь сохранить этот вектор в Y. Однако, когда я компилирую, компилятор говорит prime.adb:40:07: subtype mark required in this context. Я не уверен, что это значит. Что означает подтип? Как это исправить?Подтип Mark Обязательный в этом контексте - Ada

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Containers.Vectors; 
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Containers; 

procedure Prime is 
    package Integer_Vectors is new Vectors(Natural, Integer); 

    function Is_Prime(I : Integer) return Boolean is 
     J : Integer := 2; 
    begin 
     for J in 2 .. I-1 loop 
     if I mod J = 0 then 
      return False; 
     end if; 
     end loop; 
     return True; 
    end Is_Prime; 

    function calc_prime_numbers(n : Integer) return Integer_Vectors.Vector is 
     i : Integer := 0; 
     m : Integer; 
     Numbers : Integer_Vectors.Vector; 
    begin 
     m := n + 1; 
     while (true) loop 
     i:=i + 1; 
     if Is_Prime(i) then 
      Integer_Vectors.Append(Numbers, i); 
      Put(Integer'Image(i) & " + "); 
     end if; 
     if i = m then 
      exit; 
     end if; 
     end loop; 
     New_Line; 
     return Numbers; 
    end calc_prime_numbers; 

    X : Integer; 
    Y : Integer_Vectors; — line 40 

begin 
    while (true) loop 
     Get(X); 
     if Is_Prime(X) then 
     Put(Integer'Image(X) & " is prime."); 
     else 
     Put(Integer'Image(X) & " is not prime."); 
     end if; 
     New_Line; 
     Y := calc_prime_numbers(X); — line 40 

    end loop; 
end Prime; 
+1

Не ответ на ваш вопрос, но 'while (true) loop' является таким же, как' loop', и 'if i = m then exit; end if; 'то же, что и' exit, когда i = m; ' – egilhh

+0

Integer_Vectors - это имя пакета. Этот пакет экспортирует тип, и вы хотите использовать имя этого типа - НЕ пакет - в объявлении Y. (Глядя на документацию для универсального пакета, вы увидите имя типа ...) –

+0

См. [Здесь] (http://stackoverflow.com/a/28557589/40851) для материалов по метке подтипа. –

ответ

3

Ваш номер строки в сообщении об ошибке не соответствует код, который вы вставили, и не указывают, где линия 40, поэтому я буду гадать:

инстанцировании пакет Integer_Vectors. Позже вы объявляете переменную Y : Integer_Vectors;. Поэтому компилятор жалуется, потому что он ожидает тип переменной, тогда как вы указали имя пакета.

+0

Я обновил исходное сообщение, чтобы указать строку 40. Как я могу это исправить? Будет ли это решением? 'subtype Integer_Vectors - это Vectors (Natural, Integer);' – technogeek1995

+3

Как насчет использования типа 'Vector' в общем пакете, как вы уже делаете внутри функции calc_prime_numbers:' Numbers: Integer_Vectors.Vector; ' – egilhh