Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1124951610
впорос
2005-08-25 10:33
2005.09.18
Правильно ли переведено выражение из С в Delphi?


2-1123734834
Patrick
2005-08-11 08:33
2005.09.18
Проблема с TStrings


1-1125042779
VID
2005-08-26 11:52
2005.09.18
Как узнать в какой кодировке находится текст в файле.


2-1123737807
syte_ser78
2005-08-11 09:23
2005.09.18
помогите примером кода


14-1124958106
Cosinus
2005-08-25 12:21
2005.09.18
Помогите с решением тригонометрического уравнения...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский