comp.lang.ada
 help / color / mirror / Atom feed
From: Bill Findlay <yaldnifw@blueyonder.co.uk>
Subject: Re: Efficient Matrix?
Date: Sat, 28 Dec 2002 17:25:38 +0000
Date: 2002-12-28T17:25:38+00:00	[thread overview]
Message-ID: <BA338F12.1700%yaldnifw@blueyonder.co.uk> (raw)
In-Reply-To: wccisxeqg8m.fsf@shell01.TheWorld.com

On 28/12/02 16:07, in article wccisxeqg8m.fsf@shell01.TheWorld.com, "Robert
A Duff" <bobduff@shell01.TheWorld.com> wrote:

> Bill Findlay <yaldnifw@blueyonder.co.uk> writes:
> 
>> I get good results as follows, with GNAT 5.00w for MacOS X.
>       ^^^^
> You misspelled "bad".  ;-)
> 

I meant it was good that the OP could get the array well packed.
It is bad in every other sense. 8-)

But I read 13.2 as normative, not binding: 13.2(6) says "should try" and
13.2(7) says "recommended". 13.3 is similarly worded w.r.t. Component_Size.

> 
> That makes no sense.  How can the 'Component_Size differ between
> subtypes of the same type?  And how can the compiler accept the "for
> unconstrained_type'Component_Size use 1;", and then return
> unconstrained_type'Component_Size use = 8?

I agree that this has to be a bug.

> I suspect that if you add:
> 
>   type Unconstrained_Type_Ptr is access Unconstrained_Type;
>   B: Unconstrained_Type_Ptr := new Unconstrained_Type(1..10_000, 1..5000);
> 
> then B.all'Size will be 50_000_000, implying that

Alas not (I reduced the array bounds by a factor of 10 to get a reasonable
execution time):
----------------------------------------------------------------
procedure bla is

   type unconstrained_type is
        array (Positive range <>, Positive range <>) of Boolean;
   for unconstrained_type'Component_Size use 1;
   pragma Pack (unconstrained_type);
   type unconstrained_type_ptr is access unconstrained_type;

   subtype constrained_type is unconstrained_type (1 .. 1000, 1 .. 500);
   type constrained_type_ptr is access constrained_type;

   C : constrained_type_ptr   := new constrained_type;
   U : unconstrained_type_ptr := new unconstrained_type
                                     (1 .. 1000, 1 .. 500);

begin
   Put_Line (Integer'Image (constrained_type'Component_Size));
   Put_Line (Integer'Image (unconstrained_type'Component_Size));
   Put_Line (Integer'Image (constrained_type'Size));
   Put_Line 
("Cannot evaluate unconstrained_type'Size - would raise Constraint_Error");
   Put_Line (Integer'Image (C.all'Size));
   Put_Line (Integer'Image (U.all'Size));
   for i in C'range(1) loop
       for j in C'range(2) loop
            C(i,j) := true;
            U(i,j) := false;
        end loop;
    end loop;
   U(500, 250) := true;
   C.all := U.all;
   Put_Line("C(500, 250..251) = " &
       Boolean'image(C(500, 250)) &","& Boolean'image(C(500, 251)));
end bla;

----------------------------------------------------------------
%  ./bla
 1
 8
 500000
Cannot evaluate unconstrained_type'Size - would raise Constraint_Error
 500000
 4000000
C(500, 250..251) = TRUE,FALSE
----------------------------------------------------------------

Definitely something fishy here.
If the components of C and U had different sizes then a lot of run-time
packing would be needed to implement

   C.all := U.all;

(and indeed the object code is enormous, but I don't know enough to say if
that's what it's doing - it certainly shouldn't be).

How can we tell whether the size attributes are lying?

-- 
Bill-Findlay chez blue-yonder.co.uk ("-" => "")





  reply	other threads:[~2002-12-28 17:25 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <3e0b2a66_4@news.bluewin.ch>
2002-12-26 22:09 ` Efficient Matrix? Adrian Knoth
2002-12-27  0:23   ` Alvery Grazebrook
2002-12-27  9:53     ` Adrian Knoth
2002-12-27 16:58       ` Robert A Duff
2002-12-28  1:44         ` Nick Roberts
2002-12-28 13:00         ` Adrian Knoth
2002-12-28 15:21           ` Bill Findlay
2002-12-28 15:48             ` Adrian Knoth
2002-12-28 23:26               ` Adrian Knoth
2002-12-28 16:07             ` Robert A Duff
2002-12-28 17:25               ` Bill Findlay [this message]
2002-12-28 17:35                 ` Bill Findlay
2002-12-28 20:51                 ` Robert A Duff
2002-12-28 15:58           ` Robert A Duff
2002-12-28 17:19             ` Adrian Knoth
2002-12-28 19:16               ` James S. Rogers
2002-12-28 20:45               ` Robert A Duff
2002-12-28 22:07                 ` Adrian Knoth
2002-12-28 23:42                   ` Robert A Duff
2002-12-27 12:25 ` Gautier
replies disabled

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