comp.lang.ada
 help / color / mirror / Atom feed
* Re: Private declaration question
  1997-06-10  0:00 Private declaration question Jerry van Dijk
  1997-06-10  0:00 ` Stephen Leake
  1997-06-10  0:00 ` Dale Stanbrough
@ 1997-06-10  0:00 ` Anonymous
  1997-06-10  0:00 ` Robert A Duff
  3 siblings, 0 replies; 8+ messages in thread
From: Anonymous @ 1997-06-10  0:00 UTC (permalink / raw)



On Tue, 10 Jun 97 03:15:31 GMT, jerry@jvdsys.nextjk.stuyts.nl (Jerry van
Dijk) wrote:

> Why has the completion of a private declaration to be a full view ?
> 
>      1. package Oops is
>      2.
>      3.    type A_Type is limited private;
>      4.
>      5. private
>      6.
>      7.    type A_Type is array (Positive range <>) of Integer;
>                 |
>         >>> full view of type must be definite subtype
> 
> After browsing the RM I think the error message comes from rule
> 7.3(4). If that is true, why is this ? It seems a logical construction
> to protect A_Type objects from user interference.
> 
> --
> 
> -- Jerry van Dijk       | Leiden, Holland
> -- Consultant           | Team Ada
> -- Ordina Finance       | jdijk@acm.org
> 
> 

No, the correct ARM reference is 3.3(23):

A subtype is an indefinite subtype if it is an unconstrained array
subtype, or if it has unknown discriminants or unconstrained
discriminants without defaults (see 3.7); otherwise the subtype is a
definite subtype (all elementary subtypes are definite subtypes).

The problem here is that the language allows a client of Oops to declare
and object of type A_Type:

   Object : Oops.A_Type;

However, the full view of the type is an unconstrained array type, and
such an object declaration is illegal. It's the same as declaring

  Object : String;

You can't do this; you have to supply a definite subtype, either
explicitly

  subtype Name is String (27 .. 358);
  Object : Name;

or implicitly

  Object : String (42 .. 71);

However, there's no way for the client to know that Oops.A_Type needs
constraining, nor to constrain it.

You have several choices:

1. Make the private view of Oops.A_Type indefinite by adding the an
unknown discriminant:

   type A_Type (<>) is limited private;

2. Make the full view definite:

  type A_Type is array (Positive range 1 .. 77) of Integer;

3. Do something else. This covers a lot of territory, including having
the full view be a discriminated record type with default discriminants,
or having the full view be an extension of Ada.Finalization.Controlled
with a component of an access type that designates the unconstrained
array type.

Jeff Carter  PGP:1024/440FBE21
My real e-mail address: ( carter @ innocon . com )
"Now go away, or I shall taunt you a second time."
Monty Python & the Holy Grail

Posted with Spam Hater - see
http://www.compulink.co.uk/~net-services/spam/




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-10  0:00 Private declaration question Jerry van Dijk
@ 1997-06-10  0:00 ` Stephen Leake
  1997-06-10  0:00 ` Dale Stanbrough
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Stephen Leake @ 1997-06-10  0:00 UTC (permalink / raw)



Jerry van Dijk wrote:
> 
> Why has the completion of a private declaration to be a full view ?
> 
>      1. package Oops is
>      2.
>      3.    type A_Type is limited private;
>      4.
>      5. private
>      6.
>      7.    type A_Type is array (Positive range <>) of Integer;
>                 |
>         >>> full view of type must be definite subtype
> 
> After browsing the RM I think the error message comes from rule
> 7.3(4). If that is true, why is this ? It seems a logical construction
> to protect A_Type objects from user interference.

Actually, the error is due to RM 7.3(12); the partial view of A_Type has
no discriminants, so the full view must be a definite subtype. A
definite subtype has a known size; an unconstrained array is not a
definite subtype (as the error message says).

The reason is that the compiler must know how much memory to allocate
when a user of A_Type declares an object:

	My_Object : Oops.A_Type;

Oops provides no way to set the size of the array. The only way to fix
this, while keeping A_Type limited, is to provide a discriminant:

   package Oops is
      type A_Type (Size : Positive) is limited private;

   private
      type Array_Type is array (Positive range <>) of Integer;

      type A_Type (Size : Positive) is record
         Contents : Array_Type (1 .. Size);
      end record;
   end Oops;

Now the user can declare an object:

   A : Oops.A_Type (2);

If A_Type does not need to be limited, you can set the size by returning
a value from an initialization function:

   package Oops is
      type A_Type (<>) is private;

      function Init (Size : in Positive) return A_Type;
   private
      type A_Type is array (Positive range <>) of Integer;

   end Oops;

   package body Oops is
      function Init (Size : in Positive) return A_Type
      is begin
         return (1 .. Size => 0);
      end Init;
   end Oops;

   A : Oops.A_Type := Oops.Init (2);

-- 
- Stephe




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-10  0:00 Private declaration question Jerry van Dijk
                   ` (2 preceding siblings ...)
  1997-06-10  0:00 ` Anonymous
@ 1997-06-10  0:00 ` Robert A Duff
  3 siblings, 0 replies; 8+ messages in thread
From: Robert A Duff @ 1997-06-10  0:00 UTC (permalink / raw)



In article <865912531.32snx@jvdsys.nextjk.stuyts.nl>,
Jerry van Dijk <jerry@jvdsys.nextjk.stuyts.nl> wrote:
>     7.    type A_Type is array (Positive range <>) of Integer;
>                |
>        >>> full view of type must be definite subtype

This error message is not saying A_Type must be a full view -- it is, by
definition (full view = completion).  It is saying A_Type must be
definite, which means the size for allocating objects is known.

You can make the private type indefinite by adding "(<>)" -- unknown
discriminants.  Then then the full view can also be indefinite.

See 7.3(11-12).

- Bob




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-10  0:00     ` John G. Volan
@ 1997-06-10  0:00       ` John G. Volan
  0 siblings, 0 replies; 8+ messages in thread
From: John G. Volan @ 1997-06-10  0:00 UTC (permalink / raw)



John G. Volan wrote:
> 
>       return A_Type (1 .. Length, 1 .. Width)'(others => Value);

Woops! That should be:

        return A_Type'(1 .. Length => (1 .. Width => Value));

------------------------------------------------------------------------
Internet.Usenet.Put_Signature 
  (Name       => "John G. Volan",
   Employer   => "Texas Instruments Advanced C3I Systems, San Jose, CA",
   Work_Email => "johnv@ti.com",
   Home_Email => "johnvolan@sprintmail.com",
   Slogan     => "Ada95: World's *FIRST* International-Standard OOPL",
   Disclaimer => "My employer never defined these opinions, so using " & 
                 "them would be totally erroneous...or is that just "  &
                 "nondeterministic behavior now? :-) ");
------------------------------------------------------------------------




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-11  0:00   ` Jerry van Dijk
@ 1997-06-10  0:00     ` John G. Volan
  1997-06-10  0:00       ` John G. Volan
  0 siblings, 1 reply; 8+ messages in thread
From: John G. Volan @ 1997-06-10  0:00 UTC (permalink / raw)



Jerry van Dijk wrote:
> 
> However both GNAT and ObjectAda accept:
> 
>       type A_type (<>) is limited private;
>    ...
>    private
>       type A_Type is array (Positive range <>, Positive range <>) of Integer;
> 
> but of course fail when trying to create an A_Type object.
> 
> Any idea's ?

(1) You can provide one or more functions that return A_Type:

    type A_Type (<>) is limited private;
    function Make_A (Length, Width : in Natural;
                     Value : in Integer) return A_Type;
    ...
  private
    type A_Type is
      array (Positive range <>, Positive range <>) of Integer;

which can be implemented as, e.g.:

    function Make_A (Length, Width : in Natural;
                     Value : in Integer) return A_Type is
    begin
      return A_Type (1 .. Length, 1 .. Width)'(others => Value);
    end Make_A;
    
and which a client can utilize within the initialization of a object
declaration, e.g.:

    Clients_A : A_Type := Make_A (Clients_Length,
                                  Clients_Width,
                                  Clients_Value);

(2) Instead of declaring A_Type with unknown discriminants, give it
known discriminants:

    type A_Type (Length, Width : Natural) is private;
    ...
  private
    type A_Content_Type is
      array (Positive range <>, Positive range <>) of Integer;
    type A_Type (Length, Width : Natural) is
      record
        Content : A_Content_Type (1 .. Length, 1 .. Width);
      end record;

------------------------------------------------------------------------
Internet.Usenet.Put_Signature 
  (Name       => "John G. Volan",
   Employer   => "Texas Instruments Advanced C3I Systems, San Jose, CA",
   Work_Email => "johnv@ti.com",
   Home_Email => "johnvolan@sprintmail.com",
   Slogan     => "Ada95: World's *FIRST* International-Standard OOPL",
   Disclaimer => "My employer never defined these opinions, so using " & 
                 "them would be totally erroneous...or is that just "  &
                 "nondeterministic behavior now? :-) ");
------------------------------------------------------------------------




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Private declaration question
@ 1997-06-10  0:00 Jerry van Dijk
  1997-06-10  0:00 ` Stephen Leake
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Jerry van Dijk @ 1997-06-10  0:00 UTC (permalink / raw)



Why has the completion of a private declaration to be a full view ?

     1. package Oops is
     2.
     3.    type A_Type is limited private;
     4.
     5. private
     6.
     7.    type A_Type is array (Positive range <>) of Integer;
                |
        >>> full view of type must be definite subtype

After browsing the RM I think the error message comes from rule
7.3(4). If that is true, why is this ? It seems a logical construction
to protect A_Type objects from user interference.

--

-- Jerry van Dijk       | Leiden, Holland
-- Consultant           | Team Ada
-- Ordina Finance       | jdijk@acm.org




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-10  0:00 Private declaration question Jerry van Dijk
  1997-06-10  0:00 ` Stephen Leake
@ 1997-06-10  0:00 ` Dale Stanbrough
  1997-06-11  0:00   ` Jerry van Dijk
  1997-06-10  0:00 ` Anonymous
  1997-06-10  0:00 ` Robert A Duff
  3 siblings, 1 reply; 8+ messages in thread
From: Dale Stanbrough @ 1997-06-10  0:00 UTC (permalink / raw)



Jerry van Dijk writes:

"Why has the completion of a private declaration to be a full view ?

     1. package Oops is
     2.
     3.    type A_Type is limited private;
     4.
     5. private
     6.
     7.    type A_Type is array (Positive range <>) of Integer;
                |
        >>> full view of type must be definite subtype"


think what would happen if someone declared...

	type stuff is array (1..10) of A_Type;

Arrays can only be declared using definite (i.e. fixed size) types.

Try

	type A_Type (<>) is limited private;


Dale




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Private declaration question
  1997-06-10  0:00 ` Dale Stanbrough
@ 1997-06-11  0:00   ` Jerry van Dijk
  1997-06-10  0:00     ` John G. Volan
  0 siblings, 1 reply; 8+ messages in thread
From: Jerry van Dijk @ 1997-06-11  0:00 UTC (permalink / raw)



In article <5nibkg$p9t$1@goanna.cs.rmit.edu.au> dale@goanna.cs.rmit.EDU.AU writes:

>     3.    type A_Type is limited private;
>     7.    type A_Type is array (Positive range <>) of Integer;
>                |
>        >>> full view of type must be definite subtype"
>
>>think what would happen if someone declared...
>>
>>        type stuff is array (1..10) of A_Type;

Someone would have a problem :-)

>Arrays can only be declared using definite (i.e. fixed size) types.
>
>        type A_Type (<>) is limited private;

Ok, but then it fails on

      type A_type (<>, <>) is limited private;
   ...
   private
      type A_Type is array (Positive range <>, Positive range <>) of Integer;

However both GNAT and ObjectAda accept:

      type A_type (<>) is limited private;
   ...
   private
      type A_Type is array (Positive range <>, Positive range <>) of Integer;

but of course fail when trying to create an A_Type object.

Any idea's ?

--

-- Jerry van Dijk       | Leiden, Holland
-- Business Consultant  | Team Ada
-- Ordina Finance       | jdijk@acm.org




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~1997-06-11  0:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1997-06-10  0:00 Private declaration question Jerry van Dijk
1997-06-10  0:00 ` Stephen Leake
1997-06-10  0:00 ` Dale Stanbrough
1997-06-11  0:00   ` Jerry van Dijk
1997-06-10  0:00     ` John G. Volan
1997-06-10  0:00       ` John G. Volan
1997-06-10  0:00 ` Anonymous
1997-06-10  0:00 ` Robert A Duff

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox