Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.04;
Скачать: CL | DM;

Вниз

Почему не работает конструкция 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
2-1207594006
Nemeziz
2008-04-07 22:46
2008.05.04
Запрет на выбор IITEMS в ComboBox


15-1205880891
builder
2008-03-19 01:54
2008.05.04
Работа с сокетами в общем


15-1205948943
Express
2008-03-19 20:49
2008.05.04
Компонент для Клавиатурного тренажерa


15-1205857837
Ega23
2008-03-18 19:30
2008.05.04
А народ гребёт бабло


2-1207655460
molodoi
2008-04-08 15:51
2008.05.04
Проблема с динамическим добавлением полей