Ada_Ru форум

Обсуждение языка Ада

А, собственно, почему???

Оставить новое сообщение

Сообщения

Sergey I. Rybin
А, собственно, почему???
2003-01-28 14:19:59

Аргумент преобразования типа не может быть агрегатом???

 

Где это написано?

 

Если кто знает - спасите-помогите, а то у меня уже крыша едет!

 

Compiling: test1.adb (source file time stamp: 2003-01-28 14:10:20)

1. procedure Test1 is

2. C : Character := 'a';

3. Var : String := String ((1 => C));

1 3

>>> argument of conversion cannot be aggregate

>>> use qualified expression instead

>>> illegal operand for array conversion

 

4. Var1 : String := String'(1 => C);

5.

6. begin

7. null;

8. end Test1;

 

8 lines: 3 errors

 

E:\try-it\ada>

hi,

"Sergey I. Rybin" wrote:

Аргумент преобразования типа не может быть агрегатом???

>

Где это написано?

>

Если кто знает - спасите-помогите, а то у меня уже крыша едет!

>

Compiling: test1.adb (source file time stamp: 2003-01-28 14:10:20) >

1. procedure Test1 is

2. C : Character := 'a';

3. Var : String := String ((1 => C));

1 3

argument of conversion cannot be aggregate

use qualified expression instead

illegal operand for array conversion

>

4. Var1 : String := String'(1 => C);

5.

6. begin

7. null;

8. end Test1;

>

8 lines: 3 errors

>

E:\try-it\ada>

а все честно, между прочим!

см. RM-95 ---> 4.6 Type Conversions ---> Dynamic Semantics ---> NOTES:

5.(21) A ramification of the overload resolution rules is that the operand of an (explicit) type_conversion cannot be the literal null, an allocator, an aggregate, a string_literal, a character_literal, or an

attribute_reference

for an Access or Unchecked_Access attribute.

.....

Alex

Sergey I. Rybin wrote:

Аргумент преобразования типа не может быть агрегатом???

 

Где это написано?

 

Если кто знает - спасите-помогите, а то у меня уже крыша едет!

 

Это уже смахивает на крайне тяжелый случай! Пора отдохнуть!

 

Похоже самое интересное я пропустил.... :(((

 

 

А желающим подумать могу предложить такой пример (обсуждается сейчас в CLA):

 

Type Stream_Element_Array_access is access all Stream_Element_Array;

 

AR1 : aliased Stream_Element_Array := ( 2, 4, 5 );

AR2 : aliased Stream_Element_Array ( 1 .. 3 ) := ( 2, 4, 5 );

 

AR1A : Stream_Element_Array_access := AR1'access;

 

-- Illegal

AR2A : Stream_Element_Array_access := AR2'access;

 

 

Почему?

 

Я вторые сутки эту загадку разгадываю. И как не верчу - можно так делать и хоть тресни! По заказу вышлю свой вариант доказательства.

 

А желающим подумать могу предложить такой пример (обсуждается сейчас в CLA):

Type Stream_Element_Array_access is access all Stream_Element_Array;

AR1 : aliased Stream_Element_Array := ( 2, 4, 5 );

AR2 : aliased Stream_Element_Array ( 1 .. 3 ) := ( 2, 4, 5 );

 

AR1A : Stream_Element_Array_access := AR1'access;

 

-- Illegal

AR2A : Stream_Element_Array_access := AR2'access;

 

 

Почему?

 

И в самом деле:

 

E:\try-it\ada>gcc -c -gnatl test1.adb

 

GNAT 5.01w (20030123) Copyright 1992-2002 Free Software Foundation, Inc.

Compiling: test1.adb (source file time stamp: 2003-01-28 18:59:18)

1. with Ada.Streams; use Ada.Streams;

2. procedure Test1 is

3. type Stream_Element_Array_access is access all Stream_Element_Array; 4. AR1 : aliased Stream_Element_Array := ( 2, 4, 5 );

5. AR2 : aliased Stream_Element_Array ( 1 .. 3 ) := ( 2, 4, 5 ); |

>>> warning: aliased object has explicit bounds

>>> warning: declare without bounds (and with explicit initialization) >>> warning: for use with unconstrained access

 

6.

7. AR1A : Stream_Element_Array_access := AR1'access;

8.

9. -- Illegal

10. AR2A : Stream_Element_Array_access := AR2'access;

|

>>> object subtype must statically match designated subtype

11. begin

12. null;

13. end Test1;

 

13 lines: 1 error, 3 warnings

 

E:\try-it\ada>

 

 

А желающим подумать могу предложить такой пример (обсуждается сейчас в CLA):

Type Stream_Element_Array_access is access all Stream_Element_Array;

AR1 : aliased Stream_Element_Array := ( 2, 4, 5 );

AR2 : aliased Stream_Element_Array ( 1 .. 3 ) := ( 2, 4, 5 );

 

AR1A : Stream_Element_Array_access := AR1'access;

 

-- Illegal

AR2A : Stream_Element_Array_access := AR2'access;

 

 

Почему?

 

Вот попытка доказательства (что нельзя):

 

Шаг 1:

 

3.10.2(27):

 

If the designated type of A is tagged, then the type of the view shall be covered by

the designated type; if A▓s designated type is not tagged, then the type of the

view shall be the same, and either A▓s designated subtype

shall statically match the nominal subtype of the view,

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

or the designated subtype shall be discriminated and unconstrained;

Значится, надо, чтобы они "statically match", поскольку ничего тут нет "discriminated"

 

Шаг 2:

 

А что тут у нас за "A▓s designated subtype" и "nominal subtype of the view" А очень просто:

 

"A▓s designated subtype" - это Stream_Element_Array (НЕОГРАНИЧЕННЫЙ регулярный тип)

"nominal subtype of the view" - это Stream_Element_Array ( 1 .. 3 ), то есть ОГРАНИЧЕННЫЙ регулярный тип

 

Шаг 3:

 

Ну и как же неограниченный и ограниченный подтипы могут "statically match" в соответсвии с 4.9.1(2):

 

A subtype statically matches another subtype of the same type if they have statically matching constraints. Two anonymous access subtypes statically match if their designated subtypes statically match.

 

Годится такое доказательство (тут нет НИЧЕГО, кроме тупого формального следования формальным требованиям адского стандарта)

Sergey I. Rybin wrote:

 

А желающим подумать могу предложить такой пример (обсуждается сейчас в CLA):

 

 

Type Stream_Element_Array_access is access all Stream_Element_Array;

 

AR1 : aliased Stream_Element_Array := ( 2, 4, 5 );

AR2 : aliased Stream_Element_Array ( 1 .. 3 ) := ( 2, 4, 5 );

 

AR1A : Stream_Element_Array_access := AR1'access;

 

-- Illegal

AR2A : Stream_Element_Array_access := AR2'access;

 

 

 

Почему?

 

 

Вот попытка доказательства (что нельзя):

 

Шаг 1:

 

3.10.2(27):

 

If the designated type of A is tagged, then the type of the view shall be covered by the designated type; if A▓s designated type is not tagged, then the type of the view shall be the same, and either A▓s designated subtype shall statically match the nominal subtype of the view, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

or the designated subtype shall be discriminated and unconstrained;

 

Значится, надо, чтобы они "statically match", поскольку ничего тут нет

"discriminated"

Верно, но в RM95/TC1

 

RM/TC1 3.10.2 (24): ... The view denoted by the prefix X shall satisfy the following additional requirements, presuming the expected type for the X'Access is the general access type A with designated type D:

 

RM/TC1 3.10.2 (27/1): ...; if D is untagged, then the type view shall be D, and A's designated subtype either statically match the nominal subtype of the view or be discriminanted and unconstrained.

 

Как я понял, речь идет о A's designated subtype, и в обоих случаях он есть Stream_Element_Array _неограниченный_. Статически он не совпадает с подтипом AR2. Но он есть _неограниченный_ и следовательно - все верно!

 

С остальным согласен, действительно, номинальный тип у AR1 - неограничен, а у AR2 - ограничен.

 

Как я понял, речь идет о A's designated subtype, и в обоих случаях он есть Stream_Element_Array _неограниченный_. Статически он не совпадает с подтипом AR2. Но он есть _неограниченный_ и следовательно - все верно!

 

С остальным согласен, действительно, номинальный тип у AR1 - неограничен, а у AR2 - ограничен.

 

До меня дошло!!! Но не имеет дискриминантов!!!

 

Спасибо.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти