![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает конструкция case of и как решить проблему? [D7, WinXP]
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?
Нет, пока только дубликаты (пересечения)