Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Как называется такая конструкция?   Найти похожие ветки 

 
Проэкт   (2005-08-11 05:50) [0]

type
 TAct1 = (a1None, a1Left, a1Right);

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


 
Defunct ©   (2005-08-11 06:35) [1]

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

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

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

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


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


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

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


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

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


 
Lamer@fools.ua ©   (2005-08-11 08:26) [4]

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

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

Enumerated type.


 
Defunct ©   (2005-08-11 09:17) [5]

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

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


 
begin...end ©   (2005-08-11 10:13) [6]

> Проэкт   (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.


 
begin...end ©   (2005-08-11 10:27) [7]

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


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


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

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

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


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

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


 
begin...end ©   (2005-08-12 07:42) [9]

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

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

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


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


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

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

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


 
KilkennyCat ©   (2005-08-13 01:31) [11]


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


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


 
begin...end ©   (2005-08-13 09:37) [12]

> Проэкт   (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 = e2 then
   Beep
end.


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



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
1-1125132162
Lamer@fools.ua
2005-08-27 12:42
2005.09.18
Ещё один баг в D6


1-1124827913
ronyn
2005-08-24 00:11
2005.09.18
Scroll примерно на 32000 останавливается


1-1125301876
chili
2005-08-29 11:51
2005.09.18
Подскажите как сделать PopupMenu (менюшку с большими значками)


5-1099313917
rect
2004-11-01 15:58
2005.09.18
Компоненты


14-1124794818
Shlomo
2005-08-23 15:00
2005.09.18
Первая Ошибка!?