Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Klotilda
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
1

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

13.09.2013, 13:54. Просмотров 1371. Ответов 35
Метки нет (Все метки)

Добрый день! Я писала программу в 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
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 13:54
Ответы с готовыми решениями:

Загвоздка с оператором switch
Стоит MVS08, при вводе 5 сразу выходит из программы, а когда ошибочно, т.е....

Программа с оператором switch
Помогите пожалуйста решить простейшую задачу с оператором switch,которая...

Программа с оператором SWITCH
Написал вот такую прогу выводящую дни недели. Подскажите пожалуйста или дайте...

Работа с оператором Switch case
В общем такая ситуация. Надо написать что-то типо магазина и при выборе товара...

Работа с оператором switch в цикле
сhar ch; cin.get(ch); switch(ch) { case 'a': cout &lt;&lt; &quot;one &quot; &lt;&lt; endl;...

35
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 14:12 2
В 31 строке скобка лишняя.

Добавлено через 2 минуты
Вообще со скобками непонятно. Скобки прверяйте.
0
Klotilda
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
13.09.2013, 15:20  [ТС] 3
я закомментировала скобку. программа выдает другую ошибку

initialization of 'count' is skipped by 'case' label
see declaration of 'count'
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 15:22 4
Весь код давайте.
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
13.09.2013, 15:48 5
Цитата Сообщение от Klotilda Посмотреть сообщение
initialization of 'count' is skipped by 'case' label
see declaration of 'count'
Если внутри одного из case'ов объявляются переменные, то эта ветвь должна быть заключена в фигурные скобки.
0
Klotilda
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
14.09.2013, 16:41  [ТС] 6
Кроме этого кода есть WinMain с объявлением DialogBox и пара функций. Если я ставлю скобку, программа ругается на case.Если убрать скобку- на count,объявленный внутри case. но в 2010 студии программа работала нормально, почему в 2008 появились такие проблемы?
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.09.2013, 16:53 7
Цитата Сообщение от Klotilda Посмотреть сообщение
Если убрать скобку- на count
Раз код не хотите показывать, то попробуйте изменить имя count, возможен конфликт имён (зависит от компилятора).
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
14.09.2013, 23:00 8
Цитата Сообщение от Klotilda Посмотреть сообщение
Если я ставлю скобку
Скобки должны быть парными.

Цитата Сообщение от Klotilda Посмотреть сообщение
но в 2010 студии программа работала нормально, почему в 2008 появились такие проблемы?
Вероятно потому что 2010я более лояльно отнеслась к коду. Например в C# в подобной ситуации скобки не нужны.

Цитата Сообщение от alsav22 Посмотреть сообщение
попробуйте изменить имя count, возможен конфликт имён
Дело не в конфликте имён, а в отсутствии ограничения на область видимости переменной, объявленной внутри switch. Надо просто поставить скобки.

Добавлено через 8 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
В 31 строке скобка лишняя.
Она не лишняя. Для неё нужна парная между 7й и 8й строками.

Добавлено через 4 минуты
Цитата Сообщение от Klotilda Посмотреть сообщение
но в 2010 студии программа работала нормально
Маловероятно. Даже 2012я не позволяет скомпилировать подобный код.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
14.09.2013, 23:16 9
про скобки
http://www.cyberforum.ru/faq/thread190093-page3.html#post4366233
1
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
14.09.2013, 23:59 10
Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, вместо скобок после метки можно просто поставить пустой оператор (точку с запятой).
Всё равно не скомпилируется. Дело именно в области видимости, а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря).
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
15.09.2013, 00:03 11
Цитата Сообщение от Klotilda Посмотреть сообщение
error C2046: illegal case
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
весь весь?
и ресурсный? и resourse.h?
у тебя не скорее всего не определены макросы IDC_BUTPRESS и прочие
из за этого нелегальный case
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 00:22 12
ValeryS, ну не надо бред писать...
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
15.09.2013, 00:34 13
Цитата Сообщение от Qwertiy Посмотреть сообщение
ValeryS, ну не надо бред писать...
интересно в чем бред
ошибку читал "illegal case"
перевести ? "незаконный (нелегальный) case"
а что там в case ?
IDC_BUTPRESS
IDC_BUTCLOSE
это что ? идентификаторы кнопок, макросы
которые у студии определяются в файле resourse.h

это вы тут разогнали за скобки да область видимости
где это в ошибке?
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 00:39 14
Цитата Сообщение от ValeryS Посмотреть сообщение
интересно в чем бред
Во-первых, в процитированном сообщении скобка в 31 строке закрывает switch (которая на самом деле непарная), именно поэтому следующий за ней case становится illegal. Но это написано сразу же в следующем посте, т. е. уже не актуально.

Во-вторых, в оставшейся части темы (после удаления данной скобки) обсуждается другая ошибка, а именно "initialization of 'count' is skipped by 'case' label see declaration of 'count'", которая вызвана именно отсутствием пары скобок у кода соответствующей ветви.
0
ValeryS
Модератор
7272 / 5526 / 692
Регистрация: 14.02.2011
Сообщений: 18,721
15.09.2013, 00:45 15
Цитата Сообщение от Qwertiy Посмотреть сообщение
бсуждается другая ошибка, а именно "initialization of 'count' is skipped by 'case' label see declaration of 'count'", которая вызвана именно отсутствием пары скобок у кода соответствующей ветви.
ну а посоветовать вместо
Цитата Сообщение от Klotilda Посмотреть сообщение
case WM_INITDIALOG:
char COMmas[6], COMnum[3];
написать
C++
1
2
3
case WM_INITDIALOG: 
{
  char COMmas[6], COMnum[3];
не судьба?
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 01:04 16
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а посоветовать ... не судьба?
Ну а прочитать
Цитата Сообщение от Qwertiy Посмотреть сообщение
Цитата Сообщение от alsav22 Посмотреть сообщение
В 31 строке скобка лишняя.
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
не судьба?

Добавлено через 1 минуту
А вообще, изначально я ответил чисто по тексту ошибки, не рассматривая код. Потому что такая ошибка с переменной в case абсолютно очевидна.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 04:56 17
Цитата Сообщение от Qwertiy Посмотреть сообщение
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
Вы дальше пост прочтите:
Цитата Сообщение от alsav22 Посмотреть сообщение
обавлено через 2 минуты
Вообще со скобками непонятно. Скобки прверяйте.
И потом (чтобы понять конкретно, в чём там дело, а не ясновидением заниматься):
Цитата Сообщение от alsav22 Посмотреть сообщение
Весь код давайте.
0
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 05:13 18
Цитата Сообщение от Qwertiy Посмотреть сообщение
Всё равно не скомпилируется.
Скомпилируется:
Ошибка с оператором switch

Цитата Сообщение от Qwertiy Посмотреть сообщение
а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря)
Чушь. Объявление переменной — это не оператор (statement), а декларация (declaration). Пруфы в стандарте.
0
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 11:11 19
PS. Моё сообщение следует относить только к языку C.
0
Qwertiy
821 / 629 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 13:25 20
Цитата Сообщение от Nameless One Посмотреть сообщение
Скомпилируется:
VS такое компилирует и без точкм с запятой. А вот если добавить ещё одну ветвь case после этой, то нет, опять же независимо от наличия точкм с запятой.

Цитата Сообщение от Nameless One Посмотреть сообщение
PS. Моё сообщение следует относить только к языку C.
Я говорил о Си++.
На Си вообще все объявления должны идти в начале блока. В общем, с точкой с запятой на си не компилируется независимо от наличия фигурных скобок. Без точки с запятой компилируется только с присутствующими фигурными скобками. VS2012.

Цитата Сообщение от Nameless One Посмотреть сообщение
Чушь. Объявление переменной — это не оператор (statement), а декларация (declaration). Пруфы в стандарте.
Тогда почему такой код компилируется и работает?
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void)
{
  if(0)
    int x;
 
  puts("Yes!");
  return 0;
}
0
15.09.2013, 13:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 13:25

Нужно написать программу с оператором switch
Нужно написать программу перевода введенного символа от a до f в верхний...

Затруднения с условным оператором switch ( типы данных)
Здравствуйте! Не могу понять, как сделать без ошибки &quot; Unit1.cpp(29): E2227...

Задача с оператором switch: юзер вводит значение температуры и видит на экране совет о том как одеться
Нужно написать программу с оператором switch в которой юзер вводит значение...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru