2017-02-12 2 views
0

Je travaille à l'implémentation d'une fonction de décomposition primaire dans Ada. Je dois retourner un vecteur de calc_prime_numbers. J'essaie de stocker ce vecteur dans Y. Cependant, chaque fois que je compile, le compilateur dit prime.adb:40:07: subtype mark required in this context. Je ne suis pas sûr de ce que cela signifie. Que signifie le sous-type requis? Comment je le répare?Marque de sous-type Requis dans ce contexte - 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

Pas une réponse à votre question, mais 'while (true) loop' est la même chose que' loop', et 'if i = m alors exit; end if;; 'est la même chose que' exit quand i = m; ' – egilhh

+0

Integer_Vectors est le nom d'un paquet. Ce paquet exporte un type, et vous voulez utiliser le nom de ce type - PAS le paquet - dans la déclaration de Y. (En regardant la documentation pour le paquet générique, vous verrez le nom du type ...) –

+0

Voir [ici] (http://stackoverflow.com/a/28557589/40851) pour des informations sur la 'marque de sous-type requise'. –

Répondre

3

Votre numéro de ligne dans le message d'erreur ne correspond pas au code collé, et vous n'indique pas où la ligne 40 est, donc je vais devoir deviner:

vous instancier un paquet appelé Integer_Vectors. Plus tard, vous déclarez une variable Y : Integer_Vectors;. Le compilateur se plaint donc parce qu'il attend un type pour la variable alors que vous avez fourni le nom d'un paquet.

+0

J'ai mis à jour le message original pour indiquer la ligne 40. Comment puis-je résoudre ce problème? Serait-ce la solution? 'sous-type Integer_Vectors est Vectors (Natural, Integer);' – technogeek1995

+3

Comment utiliser le type 'Vector' dans le package générique, comme vous le faites déjà dans la fonction' calc_prime_numbers': 'Numbers: Integer_Vectors.Vector;' – egilhh