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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Klotilda
0 / 0 / 0
Регистрация: 09.04.2012
Сообщений: 100
#1

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

13.09.2013, 13:54. Просмотров 1140. Ответов 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
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 14:12     Ошибка с оператором switch #2
В 31 строке скобка лишняя.

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

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

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

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

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

Добавлено через 4 минуты
Цитата Сообщение от Klotilda Посмотреть сообщение
но в 2010 студии программа работала нормально
Маловероятно. Даже 2012я не позволяет скомпилировать подобный код.
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,338
14.09.2013, 23:16     Ошибка с оператором switch #9
про скобки
http://www.cyberforum.ru/faq/thread1...ml#post4366233
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
14.09.2013, 23:59     Ошибка с оператором switch #10
Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, вместо скобок после метки можно просто поставить пустой оператор (точку с запятой).
Всё равно не скомпилируется. Дело именно в области видимости, а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря).
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
15.09.2013, 00:03     Ошибка с оператором switch #11
Цитата Сообщение от Klotilda Посмотреть сообщение
error C2046: illegal case
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
весь весь?
и ресурсный? и resourse.h?
у тебя не скорее всего не определены макросы IDC_BUTPRESS и прочие
из за этого нелегальный case
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 00:22     Ошибка с оператором switch #12
ValeryS, ну не надо бред писать...
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
15.09.2013, 00:34     Ошибка с оператором switch #13
Цитата Сообщение от Qwertiy Посмотреть сообщение
ValeryS, ну не надо бред писать...
интересно в чем бред
ошибку читал "illegal case"
перевести ? "незаконный (нелегальный) case"
а что там в case ?
IDC_BUTPRESS
IDC_BUTCLOSE
это что ? идентификаторы кнопок, макросы
которые у студии определяются в файле resourse.h

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

Во-вторых, в оставшейся части темы (после удаления данной скобки) обсуждается другая ошибка, а именно "initialization of 'count' is skipped by 'case' label see declaration of 'count'", которая вызвана именно отсутствием пары скобок у кода соответствующей ветви.
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
15.09.2013, 00:45     Ошибка с оператором switch #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];
не судьба?
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 01:04     Ошибка с оператором switch #16
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а посоветовать ... не судьба?
Ну а прочитать
Цитата Сообщение от Qwertiy Посмотреть сообщение
Цитата Сообщение от alsav22 Посмотреть сообщение
В 31 строке скобка лишняя.
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
не судьба?

Добавлено через 1 минуту
А вообще, изначально я ответил чисто по тексту ошибки, не рассматривая код. Потому что такая ошибка с переменной в case абсолютно очевидна.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 04:56     Ошибка с оператором switch #17
Цитата Сообщение от Qwertiy Посмотреть сообщение
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
Вы дальше пост прочтите:
Цитата Сообщение от alsav22 Посмотреть сообщение
обавлено через 2 минуты
Вообще со скобками непонятно. Скобки прверяйте.
И потом (чтобы понять конкретно, в чём там дело, а не ясновидением заниматься):
Цитата Сообщение от alsav22 Посмотреть сообщение
Весь код давайте.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
15.09.2013, 05:13     Ошибка с оператором switch #18
Цитата Сообщение от Qwertiy Посмотреть сообщение
Всё равно не скомпилируется.
Скомпилируется:
Ошибка с оператором switch
Цитата Сообщение от Qwertiy Посмотреть сообщение
а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря)
Чушь. Объявление переменной — это не оператор (statement), а декларация (declaration). Пруфы в стандарте.
Nameless One
Эксперт С++
5764 / 3413 / 255
Регистрация: 08.02.2010
Сообщений: 7,429
15.09.2013, 11:11     Ошибка с оператором switch #19
PS. Моё сообщение следует относить только к языку C.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 13:25     Ошибка с оператором switch
Еще ссылки по теме:

Где ошибка в switch C++
Задача с оператором switch: юзер вводит значение температуры и видит на экране совет о том как одеться C++
C++ Программа с оператором switch
ошибка с оператором множественного выбора C++
Затруднения с условным оператором switch ( типы данных) C++

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

Или воспользуйтесь поиском по форуму:
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.09.2013, 13:25     Ошибка с оператором switch #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;
}
Yandex
Объявления
15.09.2013, 13:25     Ошибка с оператором switch
Ответ Создать тему
Опции темы

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