![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Недоумение в вопросе использования оператора CASE [D4]
Германн © (2006-08-02 01:27:00)Ну никак не понимаю почему компиллятор принимает без вопросов конструкцию:
case SpinEdit1.Value of
1,3,5..9,13 : ShowMessage('Выбор из множества "1,3,5..9,13"');
99 : ShowMessage('Выбор числа "99"');
end;
, но не принимает следущую:
const
MySet = [1,3,5..9,13];
procedure TForm1.Button1Click(Sender: TObject);
begin
case SpinEdit1.Value of
MySet : ShowMessage('Выбор из множества "1,3,5..9,13"'); - Ошибка "Incompatible types: 'Integer and Set'
99 : ShowMessage('Выбор числа "99"');
end;
Сразу скажу - справку я читал и понимаю, что
setне входит в разряд допустимых значений caseList. Но вот почему не входит!? Чем set хуже A subrange having the form First..Last, where First and Last both satisfy the criterion above and First is less than or equal to Last
или A list having the form item1, ..., itemn, where each item satisfies one of the criteria above?
Извиняюсь за дурной вопрос, заданный ночью. :-(
Leonid Troyanovsky (2006-08-03 09:49:00) [21]
> Германн © (03.08.06 00:05) [10]
> - Integer можно проверить на вхождение в множество set.
> А вот этого в операторе case сделать нельзя! И вот этого
> я не понимаю!
Не совсем, чтобы integer.
The range of a set type is the power set of a specific ordinal type,
called the base type...
The base type can have no more than 256 possible values,
and their ordinalities must fall between 0 and 255.
И алгоритм проверки в case несколько другой.
Вообще-то, если б ты рассказал, для чего оное потребовалось,
можно было б, наверное, обсуждать более содержательно.
--
Regards, LVT.
Сергей М. (2006-08-03 09:23:00) [22]
> Германн
1,3,5..9,13 в операторе case множеством фактически не является, хотя и синтаксически выглядит как множество.
Паскаль-компилятор хранит и оперирует множествами в виде битовых масок, размеры которых не фиксированы и зависят от объявления того или иного мн-ва.
А оператор case требует ц/ч константы, которые должны определять сами значения, а не какие-то там битовые маски.
Следующий код
type
TSomeInts = 1..13;
TIntSet = set of TSomeInts;
var
MySet: TIntSet;
...
MySet := [1,3,5..9,13];
приведет к записи в переменную MySet размером в 2 байта значения $23EA.
Германн (2006-08-03 00:05:00) [23]
> Ты что скрипач красного от зеленого не отличаешь.
- Integer можно сравнить на равенство с другим Integer. Это в операторе case можно сделать.
- Integer можно проверить на вхождение в поддиапазон Integer. Это в операторе case можно сделать.
- Integer можно проверить на вхождение в список других Integer. Это в операторе case можно сделать.
- Integer можно проверить на вхождение в множество set. А вот этого в операторе case сделать нельзя!И вот этого я не понимаю! Непонимаю почему в паскале такое реализовано не было.
Anatoly Podgoretsky (2006-08-02 22:46:00) [24]Ты что скрипач красного от зеленого не отличаешь.
Германн (2006-08-02 21:19:00) [25]
> Anatoly Podgoretsky © (02.08.06 20:31) [7]
Не, ну я конечно тупой, но не до такой же степени! :-)
Anatoly Podgoretsky (2006-08-02 20:31:00) [26]Не докинешь, но фразу Incompatible types: 'Integer and Set'понять то в состоянии?
Германн (2006-08-02 16:22:00) [27]
> Вирт говорил, что в case такое не надо -- это два (Кэтмар
> уклоняется от кирпичей %-).
Да. До Вирта я кирпич не докину к сожалению :-(
Плохиш (2006-08-02 13:17:00) [28]
> Германн © (02.08.06 01:27)
Потому что тип set не относиться к "ordinale" типам, о чём в справке и написано.
Ketmar (2006-08-02 10:25:00) [29]> [2] Германн © (02.08.06 01:45)
в том, что никакого "set" в case нет. а есть syntactic sugar для сравнений.
проще говоря -- ну разные куски кода за это отвечают. раз.
Вирт говорил, что в case такое не надо -- это два (Кэтмар уклоняется от кирпичей %-).
umbra (2006-08-02 10:16:00) [30]так ведь
SpinEdit1.Valueдолжно быть целого типа. На это и ругается.
Германн (2006-08-02 01:45:00) [31]
> Джо © (02.08.06 01:38) [1]
>
> Ну, оператор in (применяемый в set'ах) и = (косвенно применяемый
> в case) это, все-таки, разные вещи, негоже их объединять
> в одной конструкции case :)
>
Вот-вот. "косвенно применяемый в case"! А почему негоже? Уж если компиллятор может разобрать в операторе case "неявный" set, что ему мешает разобрать явный? В чём принципиальное различие?
Джо (2006-08-02 01:38:00) [32]Ну, оператор in (применяемый в set'ах) и = (косвенно применяемый в case) это, все-таки, разные вещи, негоже их объединять в одной конструкции case :)