Форум программистов, компьютерный форум CyberForum.ru

Ошибка с оператором switch - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Klotilda
 Аватар для Klotilda
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 98
13.09.2013, 13:54     Ошибка с оператором switch #1
Добрый день! Я писала программу в VS2010, но потом появилась необходимость запустить программу в 2008. После запуска, она ругается на этот участок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
    static HWND hComb;
 
    switch (uMsg)
    {
        case WM_INITDIALOG: 
            char COMmas[6], COMnum[3];                          //массив для полного названия ком-порта с номером
            int i,SomVar;                                       // счетчик  заполнения массива для ком порта 
            hComb=GetDlgItem(hwnd,IDC_COMBO1);
            SendMessage ( hComb,CB_RESETCONTENT,0,0);
            int count=1;
            SendMessage(hComb,CB_ADDSTRING,0,(LPARAM)"Select COM port");
            for ( i=1;i<99;i++)
            {
               strcpy(COMmas,"COM");
              _itoa(i,COMnum,10);
               strcat(COMmas,COMnum);
               int Res=CreatePort(COMmas);
               if (Res==5) strcat(COMmas,"*");
               if(Res==0 || Res==5)
               {
                    SendMessage(hComb,CB_ADDSTRING,0,(LPARAM)COMmas);
                    SendMessage(hComb,CB_SETITEMDATA,count,(LPARAM)i);
                    count++;
                    if(Res==0) CloseHandle(hPort);  
               }
            }
            SendMessage(hComb,CB_SETCURSEL,0,0);
           break;  
        }    
 
       case WM_COMMAND: 
       {
         switch(LOWORD(wpar))
         {                  
             case IDC_BUTPRESS:                                  //по нажатию кнопки заполняется listbox
             {
                HWND hEdit,hEdit2,hList;
                int nVar,nVar2;
                char cLocvar[6];
                hEdit2=GetDlgItem(hwnd,IDC_EDIT2);
                nVar=GetDlgItemInt(hwnd,IDC_EDIT1,NULL,FALSE);
                _itoa(nVar,cLocvar,10);
                char cMas[20];
                char cResMas[20];
                SendMessage (hEdit2,WM_GETTEXT,20,(LPARAM)cMas);
                int len=strlen(cMas);
                int i,j=1,k=1;
                for (i=0;i<len;i++)
                {
                     if(cMas[i]=='-') 
                        k++;    
                }
                ch=new byte [k+2];
                k=0;
 
                for (i=0;i<=len;i++)
                {
                    if(cMas[i]!='-' && cMas[i]!='\0')                     
                        cResMas[k++]=cMas[i];
 
                    else{
                        cResMas[k]='\0'; k=0;
                        ch[j++]=(byte)atoi(cResMas);
                        if(cMas[i]=='\0') break;
                    }
                }
                ch[0]=(byte)atoi(cLocvar);
                ch[j]=255;
                SendByte(ch);
                hList=GetDlgItem(hwnd,IDC_LIST1);
                SendMessage(hList,LB_ADDSTRING,0,(LPARAM)cResbuf);
                delete[] ch;
                return TRUE;
             break;
             }      
             case IDC_BUTCLOSE:                                
             {       
                EndDialog(hwnd,NULL);
                return TRUE;                                     
             }
         }                    
 
            if(HIWORD(wpar)==CBN_SELENDOK)                                 //выбор элемента списка
            {
                char COMmas[8], COMnum[3];  
                int index;
                index=SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETCURSEL,0,0);
                index=SendDlgItemMessage(hwnd,IDC_COMBO1,CB_GETITEMDATA,index,0);
                if(hPort!=INVALID_HANDLE_VALUE)
                {
                    CloseHandle(hPort); hPort = INVALID_HANDLE_VALUE;
                }
                 strcpy(COMmas,"COM");
                _itoa(index,COMnum,10);
                 strcat(COMmas,COMnum);
                 if(CreatePort(COMmas))
                 {   
                     ComPortTimeOut();
                     ComPortSettings(); 
                 }     
             
            }                                                                // end if(HIWORD(wpar)==CBN_SELENDOK)   
 
     break;                
     }                                                                      //  end case WM_COMMAND:
       
    }                                                                       // end switch (uMsg)                                                                                 
    return 0;                         
 
}
error C2046: illegal case
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 13:54     Ошибка с оператором switch
Посмотрите здесь:

C++ Ошибка с оператором
C++ Загвоздка с оператором switch
Switch где ошибка? C++
Работа с оператором Switch case C++
C++ Error C2679. Ошибка с оператором >>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.09.2013, 13:33     Ошибка с оператором switch #21
Цитата Сообщение от Qwertiy Посмотреть сообщение
Я говорил о Си++.
Только ты прокомментировал моё сообщение, которое мало того, что было в другой теме, но относилось именно к языку C (моя вина, я этого в той теме сразу явно не указал).

Цитата Сообщение от Qwertiy Посмотреть сообщение
Тогда почему такой код компилируется и работает?
А у меня — нет:
Ошибка с оператором switch

Опять же, все подробности — в стандарте языка (C).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 13:46     Ошибка с оператором switch #22
Цитата Сообщение от Nameless One Посмотреть сообщение
Только ты прокомментировал моё сообщение, которое ... было в другой теме
Потому что на неё дали ссылку...

Цитата Сообщение от Nameless One Посмотреть сообщение
но относилось именно к языку C (моя вина, я этого в той теме сразу явно не указал).
Интересно, что в той теме (по крайней мере на указанной странице) я вообще не вижу указаний на Си. А вот обсуждаемый код помечен маркером "Код C++".

Цитата Сообщение от Nameless One Посмотреть сообщение
А у меня — нет:
Я же написал, что говорю о Си++. На Си никакой код с объявлением переменных не в начале блока у меня не компилируется.

Цитата Сообщение от Nameless One Посмотреть сообщение
Опять же, все подробности — в стандарте языка (C).
Сферический стандарт в вакууме - это хорошо, но немного не то, когда нужно чтобы код реально компилировался

Добавлено через 2 минуты
PS: Похоже, четвёртую страницу там не посмотрел... Но как я уже говорил, на Си VS подобный код не компилирует принципиально.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.09.2013, 13:58     Ошибка с оператором switch #23
Цитата Сообщение от Qwertiy Посмотреть сообщение
А вот обсуждаемый код помечен маркером "Код C++".
Дело в том, что большая часть пользователей этого форума путает теги C, CPP, CSHARP, CPPQT, а также разделы, в которых создаются темы, поэтому часто приходится догадываться о происхождении кода по самому коду и/или по контексту. А код в стартовом сообщении именно что сишный (почти стандартный), несмотря на теги, в том смысле, что никаких плюсовых особенностей в нём нет.

Цитата Сообщение от Qwertiy Посмотреть сообщение
PS: Похоже, четвёртую страницу там не посмотрел...
Это потому, что четвёртая страница появилась только сегодня.

Добавлено через 4 минуты
Цитата Сообщение от Qwertiy Посмотреть сообщение
Сферический стандарт в вакууме - это хорошо
Это не то что хорошо, это просто очень хорошо, и стандарта должен придерживаться каждый программист, который хочет писать кроссплатформенный код. На особенности конкретного компилятора рассчитывать в данном случае — значит губить всю кроссплатформенность на корню.
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 15:41     Ошибка с оператором switch #24
Цитата Сообщение от Nameless One Посмотреть сообщение
На особенности конкретного компилятора рассчитывать в данном случае — значит губить всю кроссплатформенность на корню.
Эм.. В случае наличия скобок код компилируется везде и на обоих языках. В случае наличия точки с запятой в VS код не компилируется ни на одном языке. Даже если это соответствует стандарту, как раз использование этой фичи делает код непереносимым, а не наоборот. Известно, что в си переменные должны быть объявлены в начале блока, иначе код не компилируется кучей компиляторов. Не знаю, что в этом плане в стандарте, но по факту всё именно так.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.09.2013, 15:46     Ошибка с оператором switch #25
Цитата Сообщение от Qwertiy Посмотреть сообщение
В случае наличия скобок код компилируется везде и на обоих языках.
Я говорил не про конкретный случай.

Цитата Сообщение от Qwertiy Посмотреть сообщение
Даже если это соответствует стандарту, как раз использование этой фичи делает код непереносимым, а не наоборот.
Под переносимостью обычно понимают переносимость между разными платформами в пределах одного языка, а не переносимость C - C++, которая никому, в принципе, и не нужна.

Цитата Сообщение от Qwertiy Посмотреть сообщение
Известно, что в си переменные должны быть объявлены в начале блока
Уже 14 лет, как не должны быть.
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 15:57     Ошибка с оператором switch #26
Цитата Сообщение от Nameless One Посмотреть сообщение
Под переносимостью обычно понимают переносимость между разными платформами в пределах одного языка
Ну если в GCC компилируется на Си, а в VS не компилируется, то при чём тут между языками?

Цитата Сообщение от Nameless One Посмотреть сообщение
Уже 14 лет, как не должны быть.
VS2010 не компилирует этот код:
C
1
2
3
4
5
6
7
int main(void)
{
  ;
  int x;
 
  return 0;
}
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие ";" перед "тип"
а без пустого оператора всё нормально.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.09.2013, 16:02     Ошибка с оператором switch #27
Цитата Сообщение от Qwertiy Посмотреть сообщение
VS2010 не компилирует этот код:
Цитата Сообщение от Qwertiy Посмотреть сообщение
а в VS не компилируется, то при чём тут между языками?
А кто говорил, что в VS есть нормальная поддержка C(99)? Я такого не утверждал.

Если я не ошибаюсь, где-то в сети есть официальное подтверждение того, что Microsoft не заинтересован в поддержке языка C, и планирует поддерживать только C++ (с бекпортом отдельных фич в их реализацию C90).
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 16:06     Ошибка с оператором switch #28
Цитата Сообщение от Nameless One Посмотреть сообщение
А кто говорил, что в VS есть нормальная поддержка C(99)? Я такого не утверждал.
Ну так я и говорю, что "сферический стандарт в вакууме" Это как раз и есть вопрос переносимости. Зачем призывать к использованию фич, которые делают код непереносимым? Даже если по стандарту они должны работать уже 14 лет...

Цитата Сообщение от Nameless One Посмотреть сообщение
и планирует поддерживать только C++ (с бекпортом отдельных фич в их сишную реализацию C90).
На Си++ приведённый код компилируется нормально.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.09.2013, 16:11     Ошибка с оператором switch #29
Цитата Сообщение от Qwertiy Посмотреть сообщение
Ну так я и говорю, что "сферический стандарт в вакууме" Это как раз и есть вопрос переносимости. Зачем призывать к использованию фич, которые делают код непереносимым? Даже если по стандарту они должны работать уже 14 лет...
Цитата Сообщение от Qwertiy Посмотреть сообщение
На Си++ приведённый код компилируется нормально.
Я заранее извиняюсь, если пошатну чью-нибудь психику следующим высказыванием, но предыдущий пример (и твоё сообщение) говорит не о том, что приведенный код некроссплатформенный (или непереносимый) — потому что это не так, а о том, что поддержка языка C у MS VS говняная. Я не пытаюсь оскорбить при этом сам компилятор VS и его разработчиков, потому что они сами не хотят его поддерживать.

Цитата Сообщение от Qwertiy Посмотреть сообщение
На Си++ приведённый код компилируется нормально.
Читать до просветления:
Цитата Сообщение от Nameless One Посмотреть сообщение
переносимость C - C++,[...] в принципе, и не нужна.
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 23:24     Ошибка с оператором switch #30
Цитата Сообщение от Nameless One Посмотреть сообщение
говорит не о том, что приведенный код некроссплатформенный (или непереносимый) — потому что это не так, а о том, что поддержка языка C у MS VS говняная
А в чём же тогда заключается переносимость, как не в возможности скомпилировать разными компиляторами?

Цитата Сообщение от Nameless One Посмотреть сообщение
Читать до просветления:
Моя фраза относилось к
Цитата Сообщение от Nameless One Посмотреть сообщение
с бекпортом отдельных фич в их реализацию C90
В смысле что можно было бы и перенести в Си...
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.09.2013, 00:44     Ошибка с оператором switch #31
Цитата Сообщение от Qwertiy Посмотреть сообщение
А в чём же тогда заключается переносимость, как не в возможности скомпилировать разными компиляторами?
Уже писал:
Цитата Сообщение от Nameless One Посмотреть сообщение
Под переносимостью обычно понимают переносимость между разными платформами в пределах одного языка
И ещё:
Цитата Сообщение от Qwertiy Посмотреть сообщение
как не в возможности скомпилировать разными компиляторами?
… разными компиляторами ОДНОГО языка. А то, что ты понимаешь под переносимостью — это как если бы одну и ту же программу, к примеру, можно было скомпилировать с помощью компиляторов C++ и C#.
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
16.09.2013, 00:50     Ошибка с оператором switch #32
Цитата Сообщение от Nameless One Посмотреть сообщение
А то, что ты понимаешь под переносимостью — это как если бы одну и ту же программу, к примеру, можно было скомпилировать с помощью компиляторов C++ и C#.
Нет. Под переносимостью я понимаю (в данном случае), что её можно скомпилировать и в GCC, и в VS на одном и том же языке (не важно каком именно - Си или Си++, но одном и том же для обоих компиляторов).
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.09.2013, 01:32     Ошибка с оператором switch #33
Цитата Сообщение от Qwertiy Посмотреть сообщение
Под переносимостью я понимаю (в данном случае), что её можно скомпилировать и в GCC, и в VS на одном и том же языке
Это не переносимость, это всего лишь значит, что программа написана на том подмножестве C, который понимает VS.

Переносимость же определяется стандартами языка, а не степенью поддержки этих стандартов конкретным компилятором. Точно так же я могу сказать, что скомпилированная на VS программа, написанная на C++, непереносима, т.к. она не скомпилируется на Turbo C++. Но ведь это не так, просто Turbo C++ не поддерживает современные стандарты.

PS. Кстати, а почему ты ограничиваешься только двумя компиляторами?
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
16.09.2013, 01:51     Ошибка с оператором switch #34
Цитата Сообщение от Nameless One Посмотреть сообщение
Это не переносимость, это всего лишь значит, что программа написана на том подмножестве C, который понимает VS.
Ну, есть ещё некоторые фичи VS, которые не поймёт GCC

Цитата Сообщение от Nameless One Посмотреть сообщение
Точно так же я могу сказать, что скомпилированная на VS программа, написанная на C++, непереносима, т.к. она не скомпилируется на Turbo C++.
Turbo C был давно и устарел. А я говорю о текущей версии VS, а не об устаревшей.

Цитата Сообщение от Nameless One Посмотреть сообщение
PS. Кстати, а почему ты ограничиваешься только двумя компиляторами?
VS и GCC - самые популярные компиляторы, насколько я представляю. А какие ещё стоит рассматривать?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.09.2013, 02:04     Ошибка с оператором switch #35
Цитата Сообщение от Qwertiy Посмотреть сообщение
Ну, есть ещё некоторые фичи VS, которые не поймёт GCC
Только эти фичи будут нестандартными расширениями компилятора VS, непереносимыми априори. Я же говорил только о коде, который соответствует стандарту.

Цитата Сообщение от Qwertiy Посмотреть сообщение
А я говорю о текущей версии VS, а не об устаревшей.
Можешь считать, что в текущих версиях VS поддержка C «устарела», так что аналогия имеет право на жизнь.

Цитата Сообщение от Qwertiy Посмотреть сообщение
А какие ещё стоит рассматривать?
Как минимум Clang.

Добавлено через 9 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
Только эти фичи будут нестандартными расширениями компилятора VS
Кстати, у GCC тоже есть куча именно языковых расширений, которые позволяют писать хоть и непереносимые, но такие вещи как libCello (компилируется GCC и Clang).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2013, 12:47     Ошибка с оператором switch
Еще ссылки по теме:

C++ Работа с оператором switch в цикле
Ошибка кода (switch) C++
Где ошибка в switch C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Klotilda
 Аватар для Klotilda
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 98
18.09.2013, 12:47  [ТС]     Ошибка с оператором switch #36
большое спасибо за статью
Yandex
Объявления
18.09.2013, 12:47     Ошибка с оператором switch
Ответ Создать тему
Опции темы

Текущее время: 17:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru