Ada 83

Wie immer hilft die Rückkehr zu den Wurzeln (LRM_83 3.5.4(4..6)). Die Deklaration

type Integer_7 is range -2**6 .. 2**6 - 1;

ist äquivalent zu

type Anonym is new Vordefinierter_Ganzzahltyp;
subtype Integer_7 is Anonym range -2**6 .. 2**6 - 1;

Der vordefinierte Ganzzahltyp wird implizit vom Compiler ausgewählt und zwar so, dass die Grenzen von Integer_7 in ihm enthalten sind, also hier vielleicht ein 16 Bit langer Typ. Alle Berechnungen werden in diesem Typ durchgeführt, nur die Ergebnisse müssen im Bereich Integer_7 liegen.

Der implizit deklarierte Gleichheitsoperator hat also folgende Spezifikation:

function "=" (Left, Right: Anonym) return Boolean;

und 64 gehört ganz ohne Zweifel zum Wertebereich von Anonym. Die Spezifikation

function "=" (Left, Right: Integer_7) return Boolean;

dagegen würde natürlich Constraint_Error auslösen, und in diesem Fall dürfte der Compiler die Anweisung auch nicht wegoptimieren.

Ada 95

In Ada95 sind die Regeln und auch die Wortwahl ein wenig anders, das Ergebnis bleibt jedoch dasselbe.

RM_95 3.5.4(9) verwendet nicht mehr die obige Äquivalenzregel; statt dessen definiert eine Typvereinbarung nun einen Basistyp, der mit dem neuen 'Base-Attribut angesprochen werden kann (in Ada83 jedoch anonym blieb), zusammen mit dem sogenannten ersten Subtyp, hier also Integer_7'Base und Integer_7.

Alle vordefinierten Operatoren sind für den (Basis)Typ T definiert, also für die Gleichheit (RM_95 4.5.2(7)):

function "=" (Left, Right: T) return Boolean;


Ada Magica
Inhaltsverzeichnis
© Copyright 1998, 2004 C.K.W. Grein