"Dmitry A. Kazakov" wrote in message news:g2go52hf14qn.16tb2xiy7ilrf.dlg@40tude.net... > On Thu, 16 Nov 2006 18:18:47 +0100, Jean-Pierre Rosen wrote: >> Dmitry A. Kazakov a �crit : >>> On Thu, 16 Nov 2006 12:02:15 +0100, Maciej Sobczak wrote: >>> >>>> type T is range 1 .. N; >>>> type U is new Integer range 1 .. M; >>>> >>>> N must be static, but M does not have to. >>>> Why and what is the real difference between T and U? ... >> Actually, the second form should never be used: you are relying on >> Integer, a non-portable type that plays absolutely (or almost) no >> special role in Ada. Why derive from Integer, rather than from >> Long_Integer, or anything else? ... >> If you want dynamic bounds, remember that anything "dynamic" has to have >> an upper limit at some point. It is thus better to write: >> >> type Biggest_T is range 1 .. Absolute_Max_Expectable_Value; >> subtype T is Biggest_T range 1 .. N; > Well, this is nice in theory, which I strongly support. But this theory > applies only to application software, where Absolute_Max_Expectable_Value > is determinable from the problem space. > > When developing portable libraries, and Ada is one of the best choices > there, isn't it? Then the upper bound often becomes indeterminable. So > people are forced to use [new] Integer. ARM does this as well by defining > the type String based on Integer. Only in generics we have a choice to > say: Surely there is System.Max_Int! [ARM 13.7 (23)] The largest (most positive) value allowed for the expression of a signed_integer_type_definition. So you would have: type Biggest_T is range 1..System.Max_Int; subtype T is Biggest_T range 1..N; -- Stuart