From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,da74d35864a7d542,start X-Google-Attributes: gid103376,public From: Scott Renfro Subject: Discriminant as default initial value Date: 1997/03/29 Message-ID: <333DB640.59EA@sirinet.net>#1/1 X-Deja-AN: 229351145 Organization: Sirius Systems Group, Inc. Newsgroups: comp.lang.ada Date: 1997-03-29T00:00:00+00:00 List-Id: Greetings, I'm new to Ada and have scoured the FAQ, RM, and Rationale, but haven't found an answer to my question that I understand. I want to use a discriminant in a record as both a bound in the index constraint of a component declaration and as a default initial value. I'm not sure that this is allowed by the RM. The following example, while contrived, exhibits behavior that I definitely do not understand. Using GNAT 3.09 for NT with Max defined before the Position Matrix, the component record is initialized as expected. When Max is defined after the Position Matrix within the record, Max is initialized to a large value that is not even within the subtype's range. No exception is raised. Is this expected behavior? Is it permissible to use the same discriminant as both an index bound and a default initial value? Should the behavior change when the order of declaration within the record changes? Thanks in advance, Scott ----------------------------------------------------- -- -- Test_Discrim.adb -- ----------------------------------------------------- with Ada.Text_IO, Ada.Command_Line; use Ada.Text_IO; procedure Test_Discrim is type Matrix is array (Integer range <>, Integer range <>) of Integer; subtype Matrix_Range is Natural range 1 .. 80; type Matrix_Record (Columns : Matrix_Range) is record -- Max : Natural := Columns; -- if declared here, all is well Position : Matrix (1 .. Columns, 1 .. Columns); Max : Matrix_Range := Columns; -- if declared here, max improper end record; width : Matrix_Range := 1; begin width := Integer'value (Ada.Command_Line.Argument (1)); declare Temp_Matrix : Matrix_Record (Width); begin Put_Line (Integer'Image (Temp_Matrix.Max)); end; end test_discrim;