Форум: "Начинающим";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
ВнизКак называется такая конструкция? Найти похожие ветки
← →
Проэкт (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c