Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как называется такая конструкция? [D7]


Проэкт ©   (2005-08-11 05:50:00) 

type
 TAct1 = (a1None, a1Left, a1Right);

Я посмотрел, размер TAct1 - 1 байт. Значит ли это, что в этой конструкции не может быть больше 256 элементов ? И если да, то как быть, если надо больше ? Спасибо.


begin...end   (2005-08-13 09:37:00) [1]

> Проэкт   (13.08.05 01:23) [10]

> Безобразие ! Значит надо изначально назначать какому нибудь перечисляемому типу значение более 255.

Вчера, по-видимому, произошёл технический сбой на форуме, в результате чего сейчас почти все вчерашние ответы в этой (и не только этой) ветке потерялись.

Как оказалось (об этом сообщил Игорь Шевченко), размером памяти, выделяемой под переменную перечислимого типа, можно управлять с помощью директивы {$MINENUMSIZE} (minimum enumeration size). Минимальный размер перечислимого типа может быть равен 1, 2 и 4 байтам. По умолчанию он составляет 1 байт (что мы и наблюдали). Но если объявить перечислимый тип с директивой, например, {$MINENUMSIZE 4}, то под переменные такого типа (независимо от количества возможных значений типа) будет выделяться 4 байта. Поэтому в Вашем случае достаточно и в старой, и в новой версиях программы описать перечислимый тип с директивой {$MINENUMSIZE 4} (если нужно 4 байта). И ещё один важный момент -- это поможет только в случае, когда новые значения типа в новой версии будут добавлены послестарых.

Подробнее о директиве {$MINENUMSIZE} можно узнать в справке.

> Такая конструкция занимает в памяти тоже один байт : ... Как это можно объяснить ?

Это можно объяснить тем, что значения перечислимого типа интерпретируются компилятором как беззнаковые числа. Число -250 в памяти компьютера представляется точно так же, как и число 6. Поэтому приведённое Вами объявление типа эквивалентно такому:

type
 TAct1 = (a1None = 6, a1Left, a1Right = 255)


Если в одном и том же типе одному из элементов явно назначить "номер" 6, а другому -- -250, то эти значения будут одинаковыми. Это демонстрирует следующий пример кода:

type
 TEnum = (e1 = -250, e2 = 6);
var
 E: TEnum;
begin
 E := e1;
 if E = e2then
   Beep
end.


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


KilkennyCat   (2005-08-13 01:31:00) [2]


> Безобразие ! Значит надо изначально назначать какому нибудь
> перечисляемому типу значение более 255.


Это не безобразие. Если используете записи, то уже без разницы, что в них. Точно также можно жаловаться, что сначала было string[16],  а потом потребовалось полсотни....


Проэкт   (2005-08-13 01:23:00) [3]


> begin...end ©   (12.08.05 07:42) [9]
> > Проэкт   (12.08.05 06:38) [8]
>
> > Допустим я увеличил число элементов, и их стало больше
> 256
>
> Т.е. как это -- увеличили? Вы имеете в виду, что, скажем,
> в следующей версии программы поменялся (расширился) набор
> значений типа? Тогда -- да, действительно, всё собъётся.

Безобразие ! Значит надо изначально назначать какому нибудь перечисляемому типу значение более 255.

А вот ещё интересная фича !
Такая конструкция занимает в памяти тоже один байт :
 TAct1 = (a1None = -250, a1Left, a1Right = 255);
Как это можно объяснить ?


begin...end   (2005-08-12 07:42:00) [4]

> Проэкт   (12.08.05 06:38) [8]

> Допустим я увеличил число элементов, и их стало больше 256

Т.е. как это -- увеличили? Вы имеете в виду, что, скажем, в следующей версии программы поменялся (расширился) набор значений типа? Тогда -- да, действительно, всё собъётся.


Проэкт   (2005-08-12 06:38:00) [5]


> begin...end ©   (11.08.05 10:13) [6]

Спасибо, за полный ответ !

А как быть если перечисляемый тип используется в рекорде, а рекорд сохраняется на диск ?
Допустим я увеличил число элементов, и их стало больше 256, тогда значит, я уже не смогу правильно загрузить с диска рекорд, из-за того, что размерность изменилась, и всё собъётся ?


> Defunct ©   (11.08.05 06:35) [1]
> Михаил Сергеевич говорил "Проект" и был прав ;>

Это не баг, а фича.


begin...end   (2005-08-11 10:27:00) [6]

В [6] последнюю фразу читать как "Количество элементов перечислимого типа ограничено диапазоном значений типа Integer". Хотя перечислимый тип, безусловно, относится к порядковым.


begin...end   (2005-08-11 10:13:00) [7]

> Проэкт   (11.08.05 05:50)

> Как называется такая конструкция?

Перечислимый тип (enumerated type).

> Значит ли это, что в этой конструкции не может быть больше
> 256 элементов ?

Нет.

Перечислимый тип -- это набор значений, каждому из которых соответствует целое число -- "порядковый номер". Эти номера можно указывать явно (в этом случае номера могут идти не по порядку, быть отрицательными), но можно и не указывать (как в Вашем примере) -- тогда нумерация элементов начинается с нуля. Компилятор отводит под переменную порядкового типа столько памяти, сколько необходимо для хранения наибольшего номера элемента.

Например, в Вашем примере наибольший порядковый номер имеет элемент a1Right -- у него он равен 2. Для хранения числа 2 достаточно одного байта, поэтому компилятор и выделил 1 байт.

Изменим пример:

type
 TAct1 = (a1None, a1Left, a1Right = 256)


Теперь первые два элемента имеют номера 0 и 1, а последний (третий) -- 256 (его мы указали явно). Для хранения числа 256 уже недостаточно 1 байта, поэтому компилятор выделит уже 2.

Если же не указывать номера явно, то компилятор выделит 2 байта только тогда, когда число элементов превысит 256.

Количество элементов порядкового типа ограничено диапазоном значений типа Integer.


Defunct   (2005-08-11 09:17:00) [8]

Lamer@fools.ua ©   (11.08.05 08:26) [4]

ой, и правда. ошибка перевода.


Lamer@fools.ua   (2005-08-11 08:26:00) [9]

>> Defunct ©   (11.08.05 06:35) [1]

> конструкция такая называется - "Перечислимый тип" (Ordinal type)

Enumerated type.


Проэкт   (2005-08-11 08:01:00) [10]


> Defunct ©   (11.08.05 06:35) [1]
> Читаем справку по ordinal types

Чтож сказать сложно что ли ? Нету у меня сейчас под рукой Дельфи, нету !


Думкин   (2005-08-11 08:01:00) [11]

а зачем тогда спрашиваешь?


Defunct   (2005-08-11 06:35:00) [12]

конструкция такая называется - "Перечислимый тип" (Ordinal type)

> Значит ли это, что в этой конструкции не может быть больше 256 элементов ?

Читаем справку по ordinal types

> Проэкт
Михаил Сергеевич говорил "Про ект" и был прав ;>


Наверх

Титульная страница Поиск, карта сайта Написать письмо