File: AA-3-6-1.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (196 lines) | stat: -rw-r--r-- 15,307 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Index Constraints and Discrete Ranges</TITLE>
    <META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
    <META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
    <STYLE type="text/css">
    DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
    TT {font-family: "Courier New", monospace}
    DT {display: compact}
    DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
    DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Index {font-family: "Times New Roman", Times, serif}
    DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
    DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
    DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left:  10.0em; margin-bottom: 0.6em}
    DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
    DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left:  15.0em; margin-bottom: 0.6em}
    UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
    DD.Hanging {margin-left: 6.0em}
    DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.IndentedHanging {margin-left: 2.0em}
    DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.HangingInBulleted {margin-left: 4.0em}
    DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallHanging {margin-left: 7.5em}
    DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallIndentedHanging {margin-left: 2.0em}
    DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallHangingInBulleted {margin-left: 5.0em}
    DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.Enumerated {margin-left: 2.0em}
    DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallEnumerated {margin-left: 2.5em}
    DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    </STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-6.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-6-2.html">Next</A></P>
<HR>
<H1> 3.6.1 Index Constraints and Discrete Ranges</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;An <FONT FACE="Arial, Helvetica">index_constraint</FONT>
determines the range of possible values for every index of an array subtype,
and thereby the corresponding array bounds. </DIV>

<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">index_constraint<A NAME="I1874"></A>
::= </FONT>&nbsp;(<A NAME="I1875"></A><FONT FACE="Arial, Helvetica">discrete_range</FONT>&nbsp;{,&nbsp;<A NAME="I1876"></A><FONT FACE="Arial, Helvetica">discrete_range</FONT>})</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">discrete_range<A NAME="I1877"></A>
::= </FONT><I>discrete_</I><A NAME="I1878"></A><FONT FACE="Arial, Helvetica">subtype_indication</FONT>&nbsp;|&nbsp;<A NAME="I1879"></A><FONT FACE="Arial, Helvetica">range</FONT></DIV>

<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1880"></A>The type of a <FONT FACE="Arial, Helvetica">discrete_range</FONT>
is the type of the subtype defined by the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>,
or the type of the <FONT FACE="Arial, Helvetica">range</FONT>. <A NAME="I1881"></A>For
an <FONT FACE="Arial, Helvetica">index_constraint</FONT>, each <FONT FACE="Arial, Helvetica">discrete_range</FONT>
shall resolve to be of the type of the corresponding index. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>In Ada 95,
<FONT FACE="Arial, Helvetica">index_constraint</FONT>s only appear in
a <FONT FACE="Arial, Helvetica">subtype_indication</FONT>; they no longer
appear in <FONT FACE="Arial, Helvetica">constrained_array_definition</FONT>s.
</FONT></DIV>

<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;An <FONT FACE="Arial, Helvetica">index_constraint</FONT>
shall appear only in a <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
whose <FONT FACE="Arial, Helvetica">subtype_mark</FONT> denotes either
an unconstrained array subtype, or an unconstrained access subtype whose
designated subtype is an unconstrained array subtype; in either case,
the <FONT FACE="Arial, Helvetica">index_constraint</FONT> shall provide
a <FONT FACE="Arial, Helvetica">discrete_range</FONT> for each index
of the array type. </DIV>

<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1882"></A>A <FONT FACE="Arial, Helvetica">discrete_range</FONT>
defines a range whose bounds are given by the <FONT FACE="Arial, Helvetica">range</FONT>,
or by the range of the subtype defined by the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>.
</DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1883"></A>An <FONT FACE="Arial, Helvetica">index_constraint</FONT>
is <I>compatible</I> with an unconstrained array subtype if and only
if the index range defined by each <FONT FACE="Arial, Helvetica">discrete_range</FONT>
is compatible (see <A HREF="AA-3-5.html">3.5</A>) with the corresponding
index subtype. <A NAME="I1884"></A>If any of the <FONT FACE="Arial, Helvetica">discrete_range</FONT>s
defines a null range, any array thus constrained is a <I>null array</I>,
having no components. <A NAME="I1885"></A>An array value <I>satisfies</I>
an <FONT FACE="Arial, Helvetica">index_constraint</FONT> if at each index
position the array value and the <FONT FACE="Arial, Helvetica">index_constraint</FONT>
have the same index bounds. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>There is
no need to define compatibility with a constrained array subtype, because
one is not allowed to constrain it again.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1886"></A>The elaboration of an <FONT FACE="Arial, Helvetica">index_constraint</FONT>
consists of the evaluation of the <FONT FACE="Arial, Helvetica">discrete_range</FONT>(s),
in an arbitrary order. <A NAME="I1887"></A>The evaluation of a <FONT FACE="Arial, Helvetica">discrete_range</FONT>
consists of the elaboration of the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
or the evaluation of the <FONT FACE="Arial, Helvetica">range</FONT>.
</DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>43&nbsp;&nbsp;The elaboration of a <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
consisting of a <FONT FACE="Arial, Helvetica">subtype_mark</FONT> followed
by an <FONT FACE="Arial, Helvetica">index_constraint</FONT> checks the
compatibility of the <FONT FACE="Arial, Helvetica">index_constraint</FONT>
with the <FONT FACE="Arial, Helvetica">subtype_mark</FONT> (see <A HREF="AA-3-2-2.html">3.2.2</A>).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>44&nbsp;&nbsp;Even if an array value
does not satisfy the index constraint of an array subtype, Constraint_Error
is not raised on conversion to the array subtype, so long as the length
of each dimension of the array value and the array subtype match. See
<A HREF="AA-4-6.html">4.6</A>. </FONT></DIV>

<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of
array declarations including an index constraint: </I></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Examples"><TT>Board&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Matrix(1&nbsp;..&nbsp;8,&nbsp;&nbsp;1&nbsp;..&nbsp;8);&nbsp;&nbsp;<I>--&nbsp;&nbsp;see&nbsp;<A HREF="AA-3-6.html">3.6</A></I><BR>
Rectangle&nbsp;:&nbsp;Matrix(1&nbsp;..&nbsp;20,&nbsp;1&nbsp;..&nbsp;30);<BR>
Inverse&nbsp;&nbsp;&nbsp;:&nbsp;Matrix(1&nbsp;..&nbsp;N,&nbsp;&nbsp;1&nbsp;..&nbsp;N);&nbsp;&nbsp;<I>--&nbsp;&nbsp;N&nbsp;need&nbsp;not&nbsp;be&nbsp;static&nbsp;</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>Filter&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Bit_Vector(0&nbsp;..&nbsp;31);</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Example of array
declaration with a constrained array subtype: </I></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT>My_Schedule&nbsp;:&nbsp;Schedule;&nbsp;&nbsp;<I>--&nbsp;&nbsp;all&nbsp;arrays&nbsp;of&nbsp;type&nbsp;Schedule&nbsp;have&nbsp;the&nbsp;same&nbsp;bounds</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Example of record
type with a component that is an array: </I></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B>&nbsp;Var_Line(Length&nbsp;:&nbsp;Natural)&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>record</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;:&nbsp;String(1&nbsp;..&nbsp;Length);<BR>
&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;<B>record</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Examples"><TT>Null_Line&nbsp;:&nbsp;Var_Line(0);&nbsp;&nbsp;<I>--&nbsp;&nbsp;Null_Line.Image&nbsp;is&nbsp;a&nbsp;null&nbsp;array</I></TT></DIV>

<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>18.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I1888"></A>We allow the
declaration of a variable with a nominally unconstrained array subtype,
so long as it has an initialization expression to determine its bounds.
</FONT></DIV>

<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>18.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We have moved the syntax for <FONT FACE="Arial, Helvetica">index_constraint</FONT>
and <FONT FACE="Arial, Helvetica">discrete_range</FONT> here since they
are no longer used in <FONT FACE="Arial, Helvetica">constrained_array_definition</FONT>s.
We therefore also no longer have to describe the (special) semantics
of <FONT FACE="Arial, Helvetica">index_constraint</FONT>s and <FONT FACE="Arial, Helvetica">discrete_range</FONT>s
that appear in <FONT FACE="Arial, Helvetica">constrained_array_definition</FONT>s.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The rules given in RM83-3.6.1(5,7-10),
which define the bounds of an array object, are redundant with rules
given elsewhere, and so are not repeated here. RM83-3.6.1(6), which requires
that the (nominal) subtype of an array variable be constrained, no longer
applies, so long as the variable is explicitly initialized. </FONT></DIV>

<HR>
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-6.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-6-2.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>