Ada_Ru форум

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

generic formal types

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

Сообщения

Dmitriy Anisimkov
generic formal types
2003-09-14 14:37:11

Че то я в тупике. Может кто нибудь поможет, или скажет что так совсем нельзя.

 

Вот такие параметры

 

generic

type Element is private;

type Element_Offset is range <>;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

 

package Memory_Streams is

 

Как мне сделать так что бы Element_Index и Element_Offset

были между собой как

 

subtype Element_Index is Element_Offset;

 

Что бы внутри генерик пакета они были совместимы по присваиванию, и я обоих мог бы задать снаружи.

 

Мне надо это дело использовать как.

 

package Strings is new Memory_Streams

(Element => Character,

Element_Offset => Natural,

Element_Index => Positive,

Element_Array => String);

 

Или мне внутри обязательно придется карячиться с явным преобразованием типа

Element_Offset (Index)

Element_Index (Offset)

Dmitriy Anisimkov wrote:

Че то я в тупике. Может кто нибудь поможет, или скажет что так совсем нельзя.

 

Вот такие параметры

 

generic

type Element is private;

type Element_Offset is range <>;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

 

package Memory_Streams is

 

Как мне сделать так что бы Element_Index и Element_Offset

были между собой как

 

subtype Element_Index is Element_Offset;

 

Тупой отвед навскидку:

 

generic

type Element is private;

type Element_Offset is range <>;

type Element_Array is array (Element_Offset range <>) of Element;

 

package Memory_Streams is

 

subtype Element_Index is Element_Offset

 

Только зачем тогда тот Element_Index вообще нужен?

 

В чем смысл иметь и Element_Index, и Element_Offset

в составе формальных параметров настройки?

Sergey I. Rybin wrote:

Тупой отвед навскидку:

 

generic

type Element is private;

type Element_Offset is range <>;

type Element_Array is array (Element_Offset range <>) of Element;

 

package Memory_Streams is

 

subtype Element_Index is Element_Offset

 

Только зачем тогда тот Element_Index вообще нужен?

 

В чем смысл иметь и Element_Index, и Element_Offset

в составе формальных параметров настройки?

 

Element_Offset определяет длину, а Element_Index определяет индекс.

Element_Offset будет применяться для задания и получения длины

а массив будет начинаться с индекса 1.

так что

type Element_Array is array (Element_Offset range <>) of Element;

 

не подходит.

Element_Offset определяет длину, а Element_Index определяет индекс.

Element_Offset будет применяться для задания и получения длины

а массив будет начинаться с индекса 1.

так что

type Element_Array is array (Element_Offset range <>) of Element;

 

не подходит.

 

А почему, собственно, если ты сам хочешь, чтобы:

 

subtype Element_Index is Element_Offset;

 

и объявляешь _неограниченный_ массив? Все равно же

каждому экземпляру массива границы уточнять, и происходить это будет

в рамках Element_Index, который просто точно совпадает с

Element_Offset?

Sergey I. Rybin wrote:

 

Element_Offset определяет длину, а Element_Index определяет индекс.

Element_Offset будет применяться для задания и получения длины

а массив будет начинаться с индекса 1.

так что

type Element_Array is array (Element_Offset range <>) of Element;

 

не подходит.

 

 

А почему, собственно, если ты сам хочешь, чтобы:

 

subtype Element_Index is Element_Offset;

 

и объявляешь _неограниченный_ массив? Все равно же

каждому экземпляру массива границы уточнять, и происходить это будет

в рамках Element_Index, который просто точно совпадает с

Element_Offset?

 

они не совпадают, я не точно написал, мне надо

 

subtype Element_Index is Element_Offset rande 1 .. Element_Offset'Last;

 

я хочу что бы можно было уже существующие массивы

использовать в этом пакете. Например Strings.

они не совпадают, я не точно написал, мне надо

 

subtype Element_Index is Element_Offset rande 1 .. Element_Offset'Last;

 

я хочу что бы можно было уже существующие массивы

использовать в этом пакете. Например Strings.

 

Ну и ладно! Если Element_Index есть подмножество

Element_Offset, кто ж тебе мешает использовать Strings?!

 

Честно говоря, других умных мыслей так и не возникло :( :)

Sergey I. Rybin wrote:

 

они не совпадают, я не точно написал, мне надо

 

subtype Element_Index is Element_Offset rande 1 .. Element_Offset'Last;

 

я хочу что бы можно было уже существующие массивы

использовать в этом пакете. Например Strings.

 

 

Ну и ладно! Если Element_Index есть подмножество

Element_Offset, кто ж тебе мешает использовать Strings?!

 

Использовать можно, но внутри generic package нет возможности сделать Element_Index и Element_Offset совместимыми как subtype.

Или по крайней мере я не знаю как.

Приходиться карячиться с преобразованием типов.

а массив будет начинаться с индекса 1.

так что

type Element_Array is array (Element_Offset range <>) of Element;

 

не подходит.

 

 

Может так?

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

 

package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

Ураааа !!! Заработала !!!

 

Спасибо за науку.

 

Maxim Reznik wrote:

Maxim Reznik wrote:

 

Может так?

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

 

package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

 

Но ведь можно и

type Element_Index is (Red, Green, Blue);

 

Насколько я понимаю этот тип совместим с range <>, но вот 'Base range 0 .. у него нету.

 

Или я что-то не до понимаю?

 

Кстати, в подобном случае пустой массив обычно оперделяют как

A : Element_Array (Element_Index'Succ (Element_Index'First) .. Element_Index'First);

 

Всё равно все пустые массивы по сравнению равны.

 

 

-- Vadim Godunko

Hello!

 

On Mon, 15 Sep 2003, Maxim Reznik wrote:

 

а массив будет начинаться с индекса 1.

так что

 

type Element_Array is array (Element_Offset range <>) of Element;

не подходит.

 

 

Может так?

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

 

А как же это для строк подходит, если они стандартно определены как

type STRING is array ( POSITIVE range <> ) of CHARACTER ?

 

Скорее уж придётся вводить нижнюю границу подтипа:

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element; SUBTYPE_BOUND : Element_Index ;

 

package Memory_Streams is

subtype Element_Offset is

Element_Index range SUBTYPE_BOUND .. Element_Index'Last;

 

Или это не работает?

 

 

Sincerely yours Cyril Sazonov

Vadim Godunko wrote:

 

Maxim Reznik wrote:

 

Может так?

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

 

package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

 

 

Но ведь можно и

type Element_Index is (Red, Green, Blue);

 

Насколько я понимаю этот тип совместим с range <>, но вот 'Base range 0 .. у него нету.

 

 

Нет енумераторы несовместимы с range <>, они совместимы с (<>), так же как и modular.

 

RM

 

12.5.2:

formal_signed_integer_type_definition ::= range <>

formal_discrete_type_definition ::= (<>)

 

 

Или я что-то не до понимаю?

 

Кстати, в подобном случае пустой массив обычно оперделяют как

A : Element_Array (Element_Index'Succ (Element_Index'First) .. Element_Index'First);

 

А вот и нет. По умолчанию, если не указывать индексов, то.

 

A : Element_Array (Element_Index'First .. Element_Index'Prev (Element_Index'First));

Cyril Sazonov wrote:

 

package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

 

 

А как же это для строк подходит, если они стандартно определены как

type STRING is array ( POSITIVE range <> ) of CHARACTER ?

 

Потому что

subtype Pisitive is Integer;

и

 

Positive'Base это и есть Integer;

 

Скорее уж придётся вводить нижнюю границу подтипа:

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

SUBTYPE_BOUND : Element_Index ;

 

package Memory_Streams is

subtype Element_Offset is

Element_Index range SUBTYPE_BOUND .. Element_Index'Last;

 

Или это не работает?

 

Наверно это будет работать, но так как порекомендовал Максим лучше, и работает.

Dmitriy Anisimkov wrote:

Или я что-то не до понимаю?

 

Кстати, в подобном случае пустой массив обычно оперделяют как

A : Element_Array (Element_Index'Succ (Element_Index'First) .. Element_Index'First);

 

 

А вот и нет. По умолчанию, если не указывать индексов, то.

 

A : Element_Array (Element_Index'First .. Element_Index'Prev (Element_Index'First));

 

Хотя, это верно только для signed integer индексов, а как оно для enumerated и для modular я не знаю,

наверное так как Вадим говорит.

Hello!

 

On Tue, 16 Sep 2003, Dmitriy Anisimkov wrote:

 

Cyril Sazonov wrote:

 

>package Memory_Streams is

 

subtype Element_Offset is

Element_Index'Base range 0 .. Element_Index'Last;

 

 

А как же это для строк подходит, если они стандартно определены как

type STRING is array ( POSITIVE range <> ) of CHARACTER ?

 

Потому что

subtype Pisitive is Integer;

и

 

Positive'Base это и есть Integer;

 

Но 0 не принадлежит POSITIVE:

 

subtype Positive is Integer range 1 .. Integer'Last;

 

Так что мы тут вылетаем за область определения индекса STRING.

 

 

Скорее уж придётся вводить нижнюю границу подтипа:

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element; SUBTYPE_BOUND : Element_Index ;

 

package Memory_Streams is

subtype Element_Offset is

Element_Index range SUBTYPE_BOUND .. Element_Index'Last;

 

Или это не работает?

 

Наверно это будет работать, но так как порекомендовал Максим лучше, и работает.

 

Мне кажется, что этот вариант более гибок. Во всяком случае, он позволяет пользоваться не содержащим нуля Element_Index.

 

Sincerely yours Cyril Sazonov

Cyril Sazonov wrote:

А как же это для строк подходит, если они стандартно определены как

type STRING is array ( POSITIVE range <> ) of CHARACTER ?

 

Потому что

subtype Pisitive is Integer;

 

если точьнее я имел в виду subtype Pisitive is Integer rande 1 .. Integer'Last;

 

и

 

Positive'Base это и есть Integer;

 

 

Но 0 не принадлежит POSITIVE:

 

Кирил, в RM написано что аттрибут 'Base обозначает самый широкий из всех subtype данного семейства.

А Positive поддиапазон Integer. Я думаю что Integer как раз и есть самый широкий subtype.

 

subtype Positive is Integer range 1 .. Integer'Last;

 

Так что мы тут вылетаем за область определения индекса STRING.

 

не вылетаем, так как Positive у нас Element_Index.

А Element_Offset будет применяться не для индексирования, а для вычислений длины и для обозначения последнего индекса строки, который может быть 0 в случае пустой строки.

 

Скорее уж придётся вводить нижнюю границу подтипа:

 

generic

type Element is private;

type Element_Index is range <>;

type Element_Array is array (Element_Index range <>) of Element;

SUBTYPE_BOUND : Element_Index ;

 

package Memory_Streams is

subtype Element_Offset is

Element_Index range SUBTYPE_BOUND .. Element_Index'Last;

 

Или это не работает?

 

Наверно это будет работать, но так как порекомендовал Максим лучше, и работает.

 

Мне кажется, что этот вариант более гибок. Во всяком случае, он позволяет

пользоваться не содержащим нуля Element_Index.

 

А если написать

 

SUBTYPE_BOUND : Element_Index'Base := 0;

 

и

subtype Element_Offset is

Element_Index'Base range SUBTYPE_BOUND .. Element_Index'Last;

 

то будет и вашим и нашим.

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

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