comp.lang.ada
 help / color / mirror / Atom feed
From: hreba <f_hreba@yahoo.com.br>
Subject: Re: Incompatible types for array conversion
Date: Wed, 22 Jul 2015 10:22:19 -0300
Date: 2015-07-22T10:22:19-03:00	[thread overview]
Message-ID: <d19jodFl411U1@mid.individual.net> (raw)
In-Reply-To: <d19ifjFknp1U2@mid.individual.net>

On 07/22/2015 10:00 AM, hreba wrote:
> On 07/22/2015 02:20 AM, Niklas Holsti wrote:
>> On 15-07-22 04:19 , hreba wrote:
>>> I have a generic vector package:
>>>
>>> generic
>>>     dim:        positive;
>>>     type Real is digits <>;
>>> package Vectors is
>>>     type Vector is array (1..dim) of Real;
>>>     function "*" (a: Vector; b: Real) return Vector;
>>> end Vectors;
>>>
>>> In another package I want to model the definition of a (physical)
>>> position vector by its direction and module:
>>>
>>> package Basic is
>>>     type Real is new Interfaces.IEEE_Float_64;
>>>     type Length is new Real;
>>>
>>>     package Positions is new Gen.Vectors (3, Length);
>>>     package Directions is new Gen.Vectors (3, Real);
>>>
>>>     subtype Position is Positions.Vector;
>>>     subtype Direction is Directions.Vector;
>>>
>>>     function "*" (l: Direction; r: Length) return Position;
>>> end Basic;
>>>
>>> Now my attempt to define this function:
>>>
>>>     function "*" (l: Direction; r: Length) return Position is
>>>     begin return Positions."*"(Position(l), r); end "*";
>>>
>>> gets me the error message in the subject line.
>>>
>>> Do I have to convert the vector element by element in a loop or is there
>>> a more elegant way?
>>
>> The conversion is rejected because of the conversion condition in RM 4.6
>> (24.5/2): "The component subtypes shall statically match". The component
>> (sub)types are Real and Length, which are different types, although
>> Length is derived from Real. If you change the declaration of Length
>> to be
>>
>>     subtype Length is Real;
>>
>> the conversion becomes legal.
>>
>
> Thanks a lot for the hint!
>
Well, I was a little too fast with my response. It works, but it is not 
what I need. I use type Real for physical dimensionless quantities and 
Length for lengths. They must be incompatible, you cannot add them. So I 
came up with a new version of my function:

    function "*" (l: Direction; r: Length) return Position is
    begin
       return Positions."*"
         (Position'(Length(l(1)), Length(l(2)), Length(l(3))), r);
    end "*";

(Thanks God I am working with classical physics and not string theory 
with its 26 dimensions.)

-- 
Frank Hrebabetzky		+55 / 48 / 3235 1106
Florianopolis, Brazil


  reply	other threads:[~2015-07-22 13:22 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-22  1:19 Incompatible types for array conversion hreba
2015-07-22  5:20 ` Niklas Holsti
2015-07-22  7:13   ` Simon Wright
2015-07-22  7:41     ` Niklas Holsti
2015-07-22 12:32       ` Simon Wright
2015-07-27 23:12         ` Randy Brukardt
2015-07-22 13:00   ` hreba
2015-07-22 13:22     ` hreba [this message]
2015-07-22 17:50       ` Niklas Holsti
2015-07-22 19:02         ` Dmitry A. Kazakov
2015-07-22  6:49 ` Georg Bauhaus
2015-07-22 12:57   ` hreba
2015-07-22 14:22     ` G.B.
2015-07-23 13:21 ` hreba
replies disabled

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