[comp.lang.ada] implicit array subtype conversion

news@planck.uucp (Usenet News) (07/27/90)

In my zeal to limit my example and the size of the posting concerning
implict array subtype conversion, I inadvertently changed the nature of my
problem slightly.

I have defined a dynamic length string as follows:

   type STRING_RECORD (Len : NATURAL) is
      record
         S : Standard.STRING(1..Len);
      end record;

   type STRING is access STRING_RECORD;

Then, I declare some variables:

   A : Standard.STRING(7..7);
   B : Standard.STRING(1..1);
   C : STRING;

The following is accepted by the compiler (Verdix Sun 4 Self, version
6.0.2(g)) because of implicit array subtype conversion:

   A := "X";
   B := A;

However, the following is not.  Why?  I don't see the difference in the
assignment of the string because both B and C.S are constrained.

   C := new STRING_RECORD'(Len => A'length, S => A);

--
Terry J. Westley
Arvin/Calspan Advanced Technology Center
P.O. Box 400, Buffalo, NY 14225
acsu.buffalo.edu!planck!hercules!westley

eachus@linus.mitre.org (Robert I. Eachus) (07/31/90)

In article <1990Jul27.135108.11518@planck.uucp> acsu.buffalo.edu!planck!hercules!westley asks:

>  However, the following is not.  Why?  I don't see the difference in the
>  assignment of the string because both B and C.S are constrained.

   This is a language bug, not a compiler bug...  Sliding occurs on
assignment, but not in aggregate component matching.  One of the
"utility" functions I keep around for when this occurs allows me to
say: 
      C := new STRING_RECORD'(Len => A'length, S => Slide(A));

    where slide is defined as:

    function Slide (S: in String; To: in Natural := 1) return String is
      Temp: String(To..To + S'LENGTH - 1) := S;
    begin
      return Temp;
    end Slide;

    silly, but that's the way the language currently works.

Complete question, included for completeness:

   In my zeal to limit my example and the size of the posting concerning
   implict array subtype conversion, I inadvertently changed the nature of my
   problem slightly.

   I have defined a dynamic length string as follows:

      type STRING_RECORD (Len : NATURAL) is
	 record
	    S : Standard.STRING(1..Len);
	 end record;

      type STRING is access STRING_RECORD;

   Then, I declare some variables:

      A : Standard.STRING(7..7);
      B : Standard.STRING(1..1);
      C : STRING;

   The following is accepted by the compiler (Verdix Sun 4 Self, version
   6.0.2(g)) because of implicit array subtype conversion:

      A := "X";
      B := A;

   However, the following is not.  Why?  I don't see the difference in the
   assignment of the string because both B and C.S are constrained.

      C := new STRING_RECORD'(Len => A'length, S => A);
--

					Robert I. Eachus

with STANDARD_DISCLAIMER;
use  STANDARD_DISCLAIMER;
function MESSAGE (TEXT: in CLEVER_IDEAS) return BETTER_IDEAS is...