![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как называется такая конструкция? [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
> Проэкт
Михаил Сергеевич говорил "Про ект" и был прав ;>