Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про перечилимые типы   Найти похожие ветки 

 
Суслик ©   (2006-02-24 13:52) [0]

Есть тип

type
  TMyEnum = (meValue1, meValue2, meValue3)


Как определить количество вариантов значений в перечислимом типе?

Ясно, что можно сделать что-то типа такого Ord(High(TMyEnum))+1.
Но, во-первых, это будет неверно работать, если в перечислимом типе явно задавать числовые значения для элементов.
Во-вторых, корявенько это как-то.


 
Piter ©   (2006-02-24 14:10) [1]

а можно спросить зачем?

Я понимаю в функцию передается динамический массив (строка) и заранее неизвестна длина.

А тут зачем?


 
Anatoly Podgoretsky ©   (2006-02-24 14:15) [2]

type Size = (Small = 5, Medium = 10, Large = Small + Medium);

defines a type called Size whose possible values include Small, Medium, and Large, where Ord(Small) returns 5, Ord(Medium) returns 10, and Ord(Large) returns 15.
An enumerated type is, in effect, a subrange whose lowest and highest values correspond to the lowest and highest ordinalities of the constants in the declaration. In the example above, the Size type has 11 possible values whose ordinalities range from 5 to 15. (Hence the type array[Size] of Char represents an array of 11 characters.) Only three of these values have names, but the others are accessible through typecasts and through routines such as Pred, Succ, Inc, and Dec. In the following example, “anonymous” values in the range of Size are assigned to the variable X.


 
Суслик ©   (2006-02-24 14:17) [3]

Ну сейчас если скажу зачем начнут жизни учить :)

На самом деле вот для чего.

Есть тип:
type
 TMyEnum = (meValue1, meValue2, meValue3)

Есть какой-то код, в котором есть заный функционал в зависимости от значения перечислимого признака:
var
  E: TMyEnum;
begin
  case E of
     meValue1: ...;
     meValue2: ...;
     meValue3: ...;
  end;
end;

Есть желание сделать так, чтобы если я бы увеличил кол-во вариантов, то места, где нужно обработать новый вариант показались сами собой при компиляции в виде ошибок той самой компиляции.
Пока делаю так:

{$IF Ord(High(TMyEnum)) <> 2}Не все варианты обработаны{$IFEND}

Вот хотелось Ord(High(TMyEnum)) чем-нибудь более внятным заменить.

ЗЫ. Очень прошу, не учите жить :) Ну например, "вместо этого нужно использовать полиформизм" или еще что. Бывают случая, когда указанный вариант для меня оказывается удобней.


 
Суслик ©   (2006-02-24 14:18) [4]

2[2] Да знаю я про это. О чем речь?
Вопрос был про простые перечислимые типы, без явного указания значений.


 
Anatoly Podgoretsky ©   (2006-02-24 14:19) [5]

Суслик ©   (24.02.06 13:52)  
Соответственно правильно решение такое - Ord(High(TMyEnum))-Ord(Low(TMyEnum))+1


 
Anatoly Podgoretsky ©   (2006-02-24 14:21) [6]

Суслик ©   (24.02.06 14:18) [4]
Я явным указанием если в перечислимом типе явно задавать числовые значения для элементов


 
vidiv ©   (2006-02-24 14:21) [7]

А если там где
type
TMyEnum = (meValue1, meValue2, meValue3)
определить константу компилятора. с версией этого типа. я в них не рублю, так что не знаю точно как делать...

и делать чтото вроде того:
type
TMyEnum = (meValue1, meValue2, meValue3)
{$define TMyEnumVer_3}

...
{$IF NOT DEFINED TMyEnumVer_3}Не все варианты обработаны{$IFEND}

Еще раз говорю, что отражаю только принцип, синтаксис я не знаю!


 
Суслик ©   (2006-02-24 14:22) [8]


>  [5] Anatoly Podgoretsky ©   (24.02.06 14:19)

Собственно примерно так и думал.
Я вообще раньше прохладно относился к перечислимым типам. Особенно меня раздражало придумывать имена вариантам (они же должны быть уникальными).
Да и самим типам тоже придумывать имена не всегда просто. Но сейчас начал ими пользоваться.
Решил спросить, может я что-то про перечислимые типы не дочитал, а там есть интересующая меня возможность.


 
Суслик ©   (2006-02-24 14:23) [9]


>  [7] vidiv ©   (24.02.06 14:21)

Тоже вариант.


 
Anatoly Podgoretsky ©   (2006-02-24 14:26) [10]

Перечислемые типы это именованый поддиапазон
 TMyEnum = (meValue1, meValue2=2, meValue3=4)
является особой формой low(TMyEnum)..high(TMyEnum)
состоящий из 5 элементов
meValue1, anon1, meValue2, anon2, meValue3


 
vidiv ©   (2006-02-24 14:26) [11]

О!... залез сделал, работает. Изменяешь тип - накручиваешь счетчик.
DNS на таком принципе работает :)
вот:

type
 TMyType=(A, B, C, D, E, F, G, H);
 {$define TMyType_16}

{$IFNDEF TMyType_16}
!!!WARNING!!!
{$ENDIF}


 
Суслик ©   (2006-02-24 14:27) [12]

Явным указанием числовых значений вариантов я не пользуюсь.
Признаюсь, не понимаю зачем это вообще нужно. Путает только.


 
Anatoly Podgoretsky ©   (2006-02-24 14:28) [13]

Суслик ©   (24.02.06 14:27) [12]
Кого путает, а кому помогает


 
vidiv ©   (2006-02-24 14:29) [14]


> Суслик ©   (24.02.06 14:27) [12]

Если используешь чужой тип данных - может пригодится!


 
Суслик ©   (2006-02-24 14:31) [15]


> [11] vidiv ©   (24.02.06 14:26)

Наверное все-таки твой вариант не лучший, т.к. define работает только в рамках модуля.
Так что мой вариант лучше :)


 
Суслик ©   (2006-02-24 14:32) [16]


> [13] Anatoly Podgoretsky ©   (24.02.06 14:28)
> Суслик ©   (24.02.06 14:27) [12]
> Кого путает, а кому помогает

Вот скажи, а чем это может быть удобно?


 
Anatoly Podgoretsky ©   (2006-02-24 14:36) [17]

Поймешь когда потребуется.


 
vidiv ©   (2006-02-24 14:39) [18]

You can also define a conditional symbol by using the -D switch with the command-line compiler or by adding the symbol to the Conditional Defines box on the Directories/Conditionals page of the Project|Options dialog.

Note: Conditional definitions are evaluated only when source code is recompiled. If you change a conditional symbol"s status and then rebuild a project, source code in unchanged units may not be recompiled. Use Project|Build All Projects to ensure everything in your project reflects the current status of conditional symbols.


> Вот скажи, а чем это может быть удобно?

Примеры значений поля SystemIndicator (Это поле содержит тип файловой системы в информации о разделах):
 01 - FAT12
 04 - FAT16
 07 - NTFS

Отсюда:
type TSystemIndicator=(FAT12=$01, FAT16=$04, NTFS=$07)


 
Суслик ©   (2006-02-24 14:40) [19]

Кратко, но не ясно.

Могу объяснить свое непонимание.

В нашей работе широко распространенны ассоциативные массивы, т.е. ключ+значение.
Обыкновенный массив тоже ассоциативен - ключем является целое число.

В качестве значения ключа можно использовать также перечилимые типы.
При этом зачем ключу задавать еще значение? С этим легко может справиться константный массив.
Причем не только целочисленных значений, но и, например, строковых.


 
Суслик ©   (2006-02-24 14:41) [20]

2[18]
Мое мнение, что это плохой дизайн. Прочти [19]


 
Суслик ©   (2006-02-24 14:43) [21]

2[18]
Прокоментирую.
Я бы так никогда не написал.
Я бы сделал так

type
  TSystemIndicator = (FAT12, FAT16, NTFS);
const
  cSystemIndicatorValues:array[TSystemIndicator] = (1,4,7);


 
Piter ©   (2006-02-24 14:46) [22]

Суслик ©   (24.02.06 14:32) [16]
Вот скажи, а чем это может быть удобно?


например, при передаче в сторонник DLL.


 
vidiv ©   (2006-02-24 14:47) [23]


> type
>   TSystemIndicator = (FAT12, FAT16, NTFS);
> const
>   cSystemIndicatorValues:array[TSystemIndicator] = (1,4,
> 7);


А потом в коде
MyPart.SystemIndicator  = cSystemIndicatorValues[FAT12];
против
MyPart.SystemIndicator  = FAT12;

Во первых тратишь память на cSystemIndicatorValues, во вторых кода больше!

Во всяком случае зависит от задачи


 
Суслик ©   (2006-02-24 14:49) [24]


> Во первых тратишь память на cSystemIndicatorValues, во вторых
> кода больше!

Зато семантика ясна.


 
Piter ©   (2006-02-24 14:50) [25]

Суслик ©   (24.02.06 14:22) [8]
Я вообще раньше прохладно относился к перечислимым типам. Особенно меня раздражало придумывать имена вариантам


странно, что не пользовался...

А уж придумывать имена - это элементарно, потому как эти названия обозначают обычно какое-то состояние...

Сходу:

csWork / csIdle

cs от Current State.

Перечисляемые типы - имхо, очень удобно :)

Хотя у всех свои заморочки, я вот как-то давно упорно не пользовался For, зачем если есть универсальный while? :) Элементарно не помнил синтаксиса for, так как считал что незачем, чуждый элемент был... Потом втянулся, есть плюсы - наглядность, да и быстрота :)


 
Суслик ©   (2006-02-24 14:51) [26]


> [23] vidiv ©   (24.02.06 14:47)

Зато ты теряешь важную возможность, которая декларирована в самом названии типа enumeration, т.е. печечисление. Как ты перечислишь все значения в типе?


 
Суслик ©   (2006-02-24 14:52) [27]

2[25]
это хорошо, когда у тебя типов десятки, а когда сотни?
Там такие префиксы родятся, жуть.


 
Piter ©   (2006-02-24 14:59) [28]

Суслик ©   (24.02.06 14:52) [27]
Там такие префиксы родятся, жуть


покажи способ контролировать СОТНИ вариантов реализации чего-либо, чтобы было удобнее?

Собственно, перечисляемый тип - это основной тип. Это естественное решение, когда у тебя есть набор чего-то, перечисление чего-то. Как по другому то?

Если тебе нужно описать состояние объекта и возможно 5 его состояний, что ты еще придумаешь, кроме перечисляемого типа?


 
vidiv ©   (2006-02-24 15:01) [29]

var t:TMyType;
begin
for t:=A to H do begin
 case t of
  A: ShowMessage("A");
  B: ShowMessage("B");
  C: ShowMessage("C");
  D: ShowMessage("D");
  E: ShowMessage("E");
  F: ShowMessage("F");
  G: ShowMessage("G");
 end;
end;
end;


 
Суслик ©   (2006-02-24 15:01) [30]

Да я не против перечислимого типа. Я против числовых значений вариантов :)

Кстати, для перечисления состояния бывают и другие методы. Например, в рамках ООП. Паттерн "Состояние" хорошо это описывает.


 
Anatoly Podgoretsky ©   (2006-02-24 15:04) [31]

И чего ты нас уговариваешь, не хочешь не используй.


 
Anatoly Podgoretsky ©   (2006-02-24 15:04) [32]

Перечисляй все промежуточные значения, даже если они тебе не нужны.


 
Piter ©   (2006-02-24 15:04) [33]

Суслик ©   (24.02.06 15:01) [30]
Я против числовых значений вариантов :)


я уже привел пример в [22]


 
Суслик ©   (2006-02-24 15:05) [34]

Тоже верно :)


 
Суслик ©   (2006-02-24 15:06) [35]

Удалено модератором
Примечание: офтопик


 
Anatoly Podgoretsky ©   (2006-02-24 15:06) [36]

Для случая с
01 - FAT12
04 - FAT16
07 - NTFS

придется перечислять така:
type TSystemIndicator=(dummy0,FAT12, dummy2, dummy3, FAT16=, dummy5, dummy6, NTFS)


 
Суслик ©   (2006-02-24 15:09) [37]


> придется перечислять така:

вроде не так.
первое значение будет все-таки fat12.


 
Экспериментатор   (2006-02-24 19:46) [38]

Нумерация с нуля начинается, "Ежик"


 
Суслик ©   (2006-02-24 20:25) [39]

а ты провешь, "медвеженок" :)


 
Суслик ©   (2006-02-24 20:26) [40]

жонок



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

Форум: "Прочее";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.013 c
2-1141548073
Der Neck@ssoff
2006-03-05 11:41
2006.03.19
открытие файла своей прогой


3-1138093925
BAX
2006-01-24 12:12
2006.03.19
Коннект к базе?


4-1135870536
Sergey2005
2005-12-29 18:35
2006.03.19
Отловить завершение виндовс.


3-1138109495
VladRaven
2006-01-24 16:31
2006.03.19
Выборка дублей в таблице SQL


15-1140721369
ArtemESC
2006-02-23 22:02
2006.03.19
Иконки Delphi...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский