Форум: "Начинающим";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];
ВнизПочему не работает конструкция case of и как решить проблему? Найти похожие ветки
← →
Dr.Andrew (2008-04-05 20:15) [0]Уважаемые Мастера, подскажите почему не работает конструкция и как можно решить проблему, чтобы она заработала правильно:
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;
Спасибо!
← →
Loginov Dmitry © (2008-04-05 20:25) [1]Byte()
← →
Dr.Andrew (2008-04-05 20:32) [2]Спасибо!
Но компилятор выдает все же еще одну ошибку ошибку:
"[Pascal Error] Unit1.pas(218): E2030 Duplicate case label"
на строчках:
0, 1 : Result := stX + stY;
0, 2 : Result := stX + stZ;
1, 2 : Result := stY + stZ;
Как можно исправить эту проблему.
Спасибо!
← →
Dr.Andrew (2008-04-05 20:37) [3]Извинте небольшое уточнение предыдущего примера:
type
TSampleType = (stX, stY, stZ);
TSampleTipes = set of TSampleType;
private
FSampleType : TSampleTipes;
FstX; FstY; FstZ : String;
function GetInfoAboutSampleType() : String;
begin
case Byte(FSampleType) of
0 : Result := FstX;
1 : Result := FstY;
2 : Result := FstZ;
0, 1 : Result := FstX + FstY;
0, 2 : Result := FstX + FstZ;
1, 2 : Result := FstY + FstZ;
else Result := FstX + FstY + FstZ;
end;
end;
Теперь компилятор выдает еще одну ошибку:
"[Pascal Error] Unit1.pas(218): E2030 Duplicate case label"
на строчках:
0, 1 : Result := FstX + FstY;
0, 2 : Result := FstX + FstZ;
1, 2 : Result := FstY + FstZ;
Как можно исправить эту проблему.
Спасибо!
← →
Anatoly Podgoretsky © (2008-04-05 20:40) [4]> Dr.Andrew (05.04.2008 20:15:00) [0]
Изобрел новый язык.
← →
Denis__ © (2008-04-05 20:49) [5]
> Dr.Andrew (05.04.08 20:37) [3]
А как вы себе это представляете?
← →
Anatoly Podgoretsky © (2008-04-05 20:51) [6]> Denis__ (05.04.2008 20:49:05) [5]
Ну вообще то не сложно, только вот что автор пытается реализовать, а то я насчитал столько вариантов.
Но все они реализуются в основном через тривиальный IF
← →
Семеныч (2008-04-05 21:07) [7]> Dr.Andrew (05.04.08 20:37) [3]
Предположим, Byte(FSampleType) равно 2. И что делать, если у Вас написано:
2 : Result := FstZ;
0, 2 : Result := FstX + FstZ;
1, 2 : Result := FstY + FstZ;
Вот об этом Вам компилятор и сообщает - "Duplicate case label". Что по-русски означает: "Слушай, а ты сам-то понимаешь, чего ты хочешь?"
← →
Dummy (2008-04-06 06:18) [8]
> case Integer(FSampleType) of
А что, уже отменили перечисления в Case?
← →
korneley © (2008-04-06 08:43) [9]
> А что, уже отменили перечисления в Case?
Нет, пока только дубликаты (пересечения)
← →
Anatoly Podgoretsky © (2008-04-06 12:08) [10]Dummy (06.04.08 06:18) [8]
Не запрещали, но запретили писать ерунду в этих перечисления и еще в 1971 году.
← →
Dummy (2008-04-07 05:48) [11]
> Нет, пока только дубликаты (пересечения)
> Не запрещали, но запретили писать ерунду в этих перечисления
> и еще в 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;
спасет отца русской демократии.
← →
korneley © (2008-04-07 10:45) [12]
> Dummy (07.04.08 05:48) [11]
В консерватории (case) поправили. А как с типом Result быть? Сдаётся, что он, типа, строка... :)
← →
Плохиш © (2008-04-07 10:45) [13]
> Dummy (07.04.08 05:48) [11]
Какое отношение твой код имеет к вопросу ветки? И даже к твоему вопросу про перечисления?
← →
korneley © (2008-04-07 10:50) [14]
> Плохиш © (07.04.08 10:45) [13]
Ну нет. В смысле [0]"и как можно решить проблему, чтобы она заработала правильно", дело туго, но движется. Ещё бы это "правильно" протелепатировать :)))
← →
Плохиш © (2008-04-07 10:56) [15]
> korneley © (07.04.08 10:50) [14]
И как поможет решить проблему замена 0,1,2 на 1,2,4 и вписывание 4х бессмысленных строчек в case?
← →
korneley © (2008-04-07 11:11) [16]
> И как поможет решить проблему замена 0,1,2 на 1,2,4
Транслятор выдаст другую ошибку :)
← →
Семеныч (2008-04-07 11:32) [17]> 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:43) [18]
> Семеныч (07.04.08 11:32) [17]
Дык, понятно. Но, не из-за "1 + 2".
← →
Семеныч (2008-04-07 12:41) [19]> korneley © (07.04.08 11:43) [18]
Не может быть!
← →
Dummy (2008-04-07 23:02) [20]
> Вот эти 4 строчки не будут выполнены никогда
FSampleType : TSampleTipes;
TSampleTipes = set of TSampleType;
← →
Плохиш © (2008-04-07 23:14) [21]
> Dummy (07.04.08 23:02) [20]
>
> > Вот эти 4 строчки не будут выполнены никогда
>
> FSampleType : TSampleTipes;
> TSampleTipes = set of TSampleType;
И что ты хотел сказать?
← →
Германн © (2008-04-08 01:14) [22]
> Почему не работает конструкция 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-08 02:45) [23]> Dummy (07.04.08 23:02) [20]
Не может быть!
← →
Dummy (2008-04-09 08:34) [24]
> 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 == битовый массив.
← →
Dummy (2008-04-09 08:39) [25]
> 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;
Прежде, чем что-то утверждать, не мешало бы это что-то проверить. Ну или, на худой конец, справку почитать.
← →
Семеныч (2008-04-09 09:10) [26]> Dummy (09.04.08 08:34) [24]
> Set of == битовый массив.
Не может быть!
← →
Семеныч (2008-04-09 09:21) [27]<Философски-задумчиво> Вот и еще один... сколько ж их...
← →
Anatoly Podgoretsky © (2008-04-09 16:22) [28]> Dummy (09.04.2008 08:39:25) [25]
> TSampleType = (stX = 1, stY = 2, stZ = 4);
Set of? Пойду вешаться
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c