Форум: "Прочее";
Текущий архив: 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.54 MB
Время: 0.015 c