Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1207655460
molodoi
2008-04-08 15:51
2008.05.04
Проблема с динамическим добавлением полей


4-1188547784
fromats1
2007-08-31 12:09
2008.05.04
Запуск процесса от имени другого процесса


2-1207568244
azamatufa
2008-04-07 15:37
2008.05.04
Редактирование даты в БД


15-1205303786
SKIPtr
2008-03-12 09:36
2008.05.04
Помогите выбрать вентилятор


2-1207638630
MKS_
2008-04-08 11:10
2008.05.04
сбросить modal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский