1 Востаннє редагувалося Дмитро-Чебурашка (21.07.2015 17:15:18)

Тема: Як це може використовуватися перерахування enum в операторі switch?

Доброго дня !!! Що означає використання перечислимого типу enum в switch приблизно так ??

Це ж об стіну вбитися! Що це? Загалом же тип це вважай що цифри 0 1 2 і таке й подібне.

Що можна розраховувати? Що мається на увазі? Тип enum це не,, так - ні,,, це не змінні,
тип він і є тип! Що міг мати автор ???
Так як же enum може використовуватися в операторі switch, невже ж у цьому може бути який небудь сенс?

2

Re: Як це може використовуватися перерахування enum в операторі switch?

Глянь тут
http://bfy.tw/v4K

Re: Як це може використовуватися перерахування enum в операторі switch?

Зараз подивлюся! Дякую!

4 Востаннє редагувалося Дмитро-Чебурашка (21.07.2015 19:41:00)

Re: Як це може використовуватися перерахування enum в операторі switch?

Ну да .. Ні не можу. поясніть. Ось, ось ,,типє,, це викривлено кажучи об'єкт від нашого перерахування. Так?

Починає виконуватися switch (type). Далі що? Ну в трьох реченнях поясніть, як нерозуміючому (то біш насправді нерозуміючому)?


enum ERICType {Red, Orange, Yellow, Green, Blue, BluePurple, PurpleBrown, Black, White};







void ERIC::NewERIC( ERICType type )
{
    ClearShape(Environment);
        curType=type;
    switch(type)
    {
    case Red:    while ( 1 )
                       {
                         CheckLeft = *(Environment *)recalculation;
                         shift = *(Environment *)(*((Environment *)LL++) + buried);
                         ++memory;
                         if ( *(Environment *)(CheckLeft + buried) != shift )
                           break;
                         for(i=0; i<9; i++)    shades[i]=field(*(Environment *), i+bas); 
                         Turn (cloud, computable, 0);  
                         --limit;
                         if ( !limit ){Reallocate (distance, area, color, 0);
                           goto 0_field_0;}
                       }
            break;

    case Orange:    while ( 1 )
                       {
                         CheckLeft = *(Environment *)recalculation;
                         shift = *(Environment *)(*((Environment *)LL++) + buried);
                         ++memory;
                         if ( *(Environment *)(CheckLeft + buried) != shift )
                           break;
                         for(i=0; i<15; i++)    shades[i]=field(*(Environment *), i+bas);   
                         Turn (cloud, computable, 3);  
                         --limit;
                         if ( !limit ){Reallocate (distance, area, color, 1);
                           goto 0_field_0;}
                       }
                    

5 Востаннє редагувалося koala (22.07.2015 08:09:47)

Re: Як це може використовуватися перерахування enum в операторі switch?

Код реально страшний. Чесно.
А щоб відповісти на ваше питання, доведеться перепитати у вас - а ви знаєте, що таке switch і як він працює? Звичайний switch, без enum-ів? Якщо ні - почитайте. Якщо так - то просто сприймайте enum як аналог проголошення кількох констант, з вашого прикладу

enum ERICType {Red, Orange, Yellow, Green, Blue, BluePurple, PurpleBrown, Black, White};

майже еквівалентно

#define Red    0
...
#define White  8

тільки компактніше виглядає.

Подякували: Дмитро-Чебурашка1

Re: Як це може використовуватися перерахування enum в операторі switch?

Код реально страшний. Чесно.
код такий страшний що я довго соромився його викласти а потім прибрав, та виклав таки знов.

7 Востаннє редагувалося Дмитро-Чебурашка (22.07.2015 14:18:45)

Re: Як це може використовуватися перерахування enum в операторі switch?

switch (Змінна) набуває значення змінної.

case Значення перевіряє рівність змінної і значення.

Але ж? Я ж правильно розумію?


Тобто наприклад N=3;

case (1) " Не виконуємо "

case (2) " Не виконуємо "

case (3) " А ось виконуємо! "

Я ж чітко і вірно розумію? А то я сам боюся інших заплутати.

А ось далі у мене щось ,,ум за розум,, заходить.

type містить у собі відразу купу значень - і Red, і Orange, і Yellow, і т.д...

У кожному операторові case тепер що з чим порівнюється? Як здійснюється вибір?

Я не можу зрозуміти сутність ідеї!

8 Востаннє редагувалося Дмитро-Чебурашка (22.07.2015 15:41:12)

Re: Як це може використовуватися перерахування enum в операторі switch?

Так, я, звичайно, бачу тепер, що туди передається однє й тільки однє значення
з перерахування. Відладчик Визуал Студио рулює!
Мені з коду цього було дійсно не видно.

9

Re: Як це може використовуватися перерахування enum в операторі switch?

Будь ласка, обережніше зі словами. Вони іноді мають чітке значення :) switch не "набуває значення", а виконує перехід на той case, значення якого збігається зі значенням параметру switch.

Прихований текст

Причому, оскільки switch-case в певному сенсі еквівалентний goto-label, два case поспіль без break між ними будуть виконуватися послідовно (це зветься "провалюванням", fallthrough, і дуже радять в таких випадках ставити коментар із цим словом).

ERICType type містить в собі стільки ж значень, скільки й int x - бо enum представляється насправді int-ом. Тобто у вас, фактично, є

#define Red 0
#define Orange 1
void ERIC::NewERIC( int type )
{
...
    switch(type)
    {
    case Red /*тобто 0*/:...

тільки код компактніший (замість 10 define-ів один enum) і краще читаний (функція замість незрозумілого цілого значення приймає ERICType).

Можете всю ту функцію сюди скопіювати?

Подякували: Дмитро-Чебурашка1

Re: Як це може використовуватися перерахування enum в операторі switch?

Спасибі величезне!! Так ясніше.

Усю функцію... ні, це не потрібно, там теж порядком накручено, не треба.
Я поки сам ще порозбираюся.

Спасибі велике!

11

Re: Як це може використовуватися перерахування enum в операторі switch?

koala написав:

Код реально страшний. Чесно.

Так це і є добре! Вашому мозку є де відпочити і самоствердитися (як добре, що це - не мій код!). А Дмитро-Чебурашка збільшив показник активності форума.

Подякували: Дмитро-Чебурашка1