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

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

Почему не работает конструкция case of и как решить проблему? [D7, WinXP]


Страницы:   1 2

Dr.Andrew ©   (2008-04-05 20:15:00) 

Уважаемые Мастера, подскажите почему не работает конструкция и как можно решить проблему, чтобы она заработала правильно:

type
 TSampleType = (stX, stY, stZ);
 TSampleTipes = set of TSampleType;

private
 FSampleType : TSampleTipes;

function GetInfoAboutSampleType() : String;
begin
 case Integer(FSampleType) of
      0 : Result := stX;
      1 : Result := stY;
      2 : Result := stZ;
   0, 1 : Result := stX + stY;
   0, 2 : Result := stX + stZ;
   1, 2 : Result := stY + stZ;
     else Result := stX + stY + stZ;
 end;
end;

Спасибо!


Anatoly Podgoretsky   (2008-04-09 16:22:00) [1]

> Dummy  (09.04.2008 08:39:25)  [25]

> TSampleType = (stX = 1, stY = 2, stZ = 4);

Set of? Пойду вешаться


Семеныч   (2008-04-09 09:21:00) [2]

<Философски-задумчиво> Вот и еще один... сколько ж их...


Семеныч   (2008-04-09 09:10:00) [3]

> Dummy   (09.04.08 08:34) [24]

> Set of == битовый массив.

Не может быть!


Dummy   (2008-04-09 08:39:00) [4]


> TSampleType = (stX = 1, stY = 2, stZ = 4);

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

> 1 + 2 : Result := FstX + FstY;

Аналогично вышесказанному.


> Вот эти 4 строчки не будут выполнены никогда:
> 1 + 2 : Result := FstX + FstY;
> 1 + 4 : Result := FstX + FstZ;
> 2 + 4 : Result := FstY + FstZ;
> else Result := FstX + FstY + FstZ;

Прежде, чем что-то утверждать, не мешало бы это что-то проверить. Ну или, на худой конец, справку почитать.


Dummy   (2008-04-09 08:34:00) [5]


> function GetInfoAboutSampleType() : String;
> begin
> case Byte(FSampleType) of
>      0 : Result := FstX;
>      1 : Result := FstY;
>      2 : Result := FstZ;
>      3 : Result := FstX + FstY;
>      5 : Result := FstX + FstZ;
>      6 : Result := FstY + FstZ;
>     else Result := FstX + FstY + FstZ;
> end;
> end;


> 2. Потому что не знаешь основ и не можешь соотнести некое
> "множество" к реальному содержимому памяти, которое оно
> занимает


Вот и соотнесите:

type
 A = (a1, a2, a3);
 AA = set of A;

var
 B: AA;
begin
 B := [a1];
 ShowMessage(IntToStr(Byte(B)));
end;


Знатоки, блин, основ. Set of == битовый массив.


Семеныч   (2008-04-08 02:45:00) [6]

> Dummy   (07.04.08 23:02) [20]

Не может быть!


Германн   (2008-04-08 01:14:00) [7]


> Почему не работает конструкция case of
>  

1. Потому что "selectorExpression is any expression of an ordinal type", а "set of
TSampleType" к таковым не относится.
2. Потому что не знаешь основ и не можешь соотнести некое "множество" к реальному содержимому памяти, которое оно занимает.


> и как решить проблему?

Для данного примера - просто:
function GetInfoAboutSampleType() : String;
begin
case Byte(FSampleType) of
     0 : Result := FstX;
     1 : Result := FstY;
     2 : Result := FstZ;
     3 : Result := FstX + FstY;
     5 : Result := FstX + FstZ;
     6 : Result := FstY + FstZ;
    else Result := FstX + FstY + FstZ;
end;
end;


Плохиш   (2008-04-07 23:14:00) [8]


> Dummy   (07.04.08 23:02) [20]
>
> > Вот эти 4 строчки не будут выполнены никогда
>
> FSampleType : TSampleTipes;
> TSampleTipes = set of TSampleType;

И что ты хотел сказать?


Dummy   (2008-04-07 23:02:00) [9]


> Вот эти 4 строчки не будут выполнены никогда

FSampleType : TSampleTipes;
TSampleTipes = set of TSampleType;


Семеныч   (2008-04-07 12:41:00) [10]

> korneley ©   (07.04.08 11:43) [18]

Не может быть!


korneley   (2008-04-07 11:43:00) [11]


> Семеныч   (07.04.08 11:32) [17]

Дык, понятно. Но, не из-за "1 + 2".


Семеныч   (2008-04-07 11:32:00) [12]

> Dummy   (07.04.08 05:48) [11]

Вот эти 4 строчки не будут выполнены никогда:
1 + 2 : Result := FstX + FstY;
1 + 4 : Result := FstX + FstZ;
2 + 4 : Result := FstY + FstZ;
else Result := FstX + FstY + FstZ;


korneley   (2008-04-07 11:11:00) [13]


> И как поможет решить проблему замена 0,1,2 на 1,2,4
Транслятор выдаст другуюошибку :)


Плохиш   (2008-04-07 10:56:00) [14]


> korneley ©   (07.04.08 10:50) [14]

И как поможет решить проблему замена 0,1,2 на 1,2,4 и вписывание 4х бессмысленных строчек в case?


korneley   (2008-04-07 10:50:00) [15]


> Плохиш ©   (07.04.08 10:45) [13]

Ну нет. В смысле [0]"и как можно решить проблему, чтобы она заработала правильно", дело туго, но движется. Ещё бы это "правильно" протелепатировать :)))


Плохиш   (2008-04-07 10:45:00) [16]


> Dummy   (07.04.08 05:48) [11]

Какое отношение твой код имеет к вопросу ветки? И даже к твоему вопросу про перечисления?


korneley   (2008-04-07 10:45:00) [17]


> Dummy   (07.04.08 05:48) [11]

В консерватории (case) поправили. А как с типом Result быть? Сдаётся, что он, типа, строка... :)


Dummy   (2008-04-07 05:48:00) [18]


> Нет, пока только дубликаты (пересечения)


> Не запрещали, но запретили писать ерунду в этих перечисления
> и еще в 1971 году.

Я спрашивал про перечисления, а не про конструкцию case.

А вообще, если объявить
type
TSampleType = (stX = 1, stY = 2, stZ = 4);

то

case Byte(FSampleType) of
     1 : Result := FstX;
     2 : Result := FstY;
     4 : Result := FstZ;
1 + 2 : Result := FstX + FstY;
1 + 4 : Result := FstX + FstZ;
2 + 4 : Result := FstY + FstZ;
    else Result := FstX + FstY + FstZ;
end;

спасет отца русской демократии.


Anatoly Podgoretsky   (2008-04-06 12:08:00) [19]

Dummy   (06.04.08 06:18) [8]
Не запрещали, но запретили писать ерунду в этих перечисления и еще в 1971 году.


korneley   (2008-04-06 08:43:00) [20]


> А что, уже отменили перечисления в Case?
Нет, пока только дубликаты (пересечения)


Страницы:   1 2

Наверх

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