2017-03-06 5 views
1

Je prends Ada au collège. Aujourd'hui, mon professeur nous a posé une question. Dans le bit de code suivant, il y a trois déclarations de type. Le troisième ne compile pas avec une erreur 'missing new'.Ada Type Déclaration Sémantique

Je suppose que le mot-clé « Type » permet au compilateur que nous définissons sur une classe de stockage Mes questions sont les suivantes:

quelles sont les différences sémantiques entre les déclarations?
Si le mot clé Entier est omis, Ada suppose-t-il le type entier universel lorsque la plage est spécifiée? Cela semble être un résultat logique et évident. De plus, lorsque le mot-clé "Integer" est avant "range" est nouveau alors nécessaire? J'espère que ce n'était pas ambigu, j'ai fait quelques recherches, mais je n'arrive pas à trouver une réponse exacte, ou peut-être que je suis beaucoup d'un débutant avec Ada pour comprendre ce que j'ai trouvé. Je voudrais vraiment comprendre ce qui se passe ci-dessous.

with Ada.Text_IO; use ada.Text_IO; 
    procedure any is 
    type abc is new Integer range 1..10; 
    num : abc; 
    type def is range 1..10; 
    num2 : def; 
    type xyz is Integer range 1..10; 
    num3 : xyz; 
     begin 
     num := 5; 
     num2 := 6; 
     num3 := 7; 
end any; 
+1

Encore quelques mots sur 'Integer': répondre à l'appel de' Integer' peut être un peu déroutant parce que c'est juste un nom, alors que les mots-clés sont généralement réservés à la syntaxe, ou à d'autres usages spéciaux . ** type ** et ** fin ** sont de ce type. 'Integer' est le nom d'un sous-type parfaitement normal défini dans la bibliothèque Ada. Ce type 'Integer' est à utiliser avec d'autres sous-programmes de bibliothèque, généralement. Donc, définir des types comme 'def' comme vous l'avez fait est juste. – B98

Répondre

5

Dans la première déclaration, vous déclarez un type nouveau, distinct de Integer, mais héritant quelques propriétés de celui-ci (fonctions et opérateurs primitifs, par exemple, pas qu'il importe).

Pour tous les aspects pratiques, les types abc et def sont sémantiquement équivalents dans ce cas. Cependant, si vous aviez des opérations primitives sur votre type de base, ce serait différent.

Vous ne pouvez pas vraiment considérer que les limites des plages ont des types dans ce cas, mais s'il existe un type de base, elles doivent remplir la contrainte d'être dans la plage du type de base.

Maintenant, xyz est simplement incorrect, et Integer ne veut rien dire ici. Cela peut vouloir dire deux choses:

  • Vous vouliez vraiment déclarer un nouveau type dérivé d'entier. Dans ce cas, il vous manque le nouveau mot-clé.
  • Vous vouliez déclarer un sous-type d'entier. Un sous-type est fondamentalement équivalent à son type de base en ce qui concerne la résolution de noms et la correspondance de type statique, mais aura des contraintes différentes à l'exécution.

De plus, lorsque le mot-clé « entier » est avant « range » est nouveau alors nécessaire?

Integer n'est pas un mot-clé, c'est un type défini dans le package standard. Dans cette déclaration

type A is Integer range 1 .. 10; 

Integer est une référence à un type où Ada ne prévoit pas. Il attend soit une définition de type, soit un type de base.

+0

Merci d'avoir pris le temps de l'expliquer ainsi que de vous éclaircir. J'ai mal compris certaines choses en même temps, donc c'était très utile. –

+0

Pas de problème :) Glad it helps! –