Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Недоумение в вопросе использования оператора CASE [D4]


Страницы:   1 2

Германн ©   (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 :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо