1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день! Я писала программу в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2013, 13:54
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 2 минуты
Вообще со скобками непонятно. Скобки прверяйте.
0
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 15:22 4
Весь код давайте.
0
833 / 641 / 101
Регистрация: 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
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
14.09.2013, 16:41  [ТС] 6
Кроме этого кода есть WinMain с объявлением DialogBox и пара функций. Если я ставлю скобку, программа ругается на case.Если убрать скобку- на count,объявленный внутри case. но в 2010 студии программа работала нормально, почему в 2008 появились такие проблемы?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.09.2013, 16:53 7
Цитата Сообщение от Klotilda Посмотреть сообщение
Если убрать скобку- на count
Раз код не хотите показывать, то попробуйте изменить имя count, возможен конфликт имён (зависит от компилятора).
0
833 / 641 / 101
Регистрация: 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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
14.09.2013, 23:16 9
про скобки
https://www.cyberforum.ru/faq/... ost4366233
1
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
14.09.2013, 23:59 10
Цитата Сообщение от Nameless One Посмотреть сообщение
Кстати, вместо скобок после метки можно просто поставить пустой оператор (точку с запятой).
Всё равно не скомпилируется. Дело именно в области видимости, а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря).
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
15.09.2013, 00:03 11
Цитата Сообщение от Klotilda Посмотреть сообщение
error C2046: illegal case
Не могу найти ошибку, копировала все. Помогите, пожалуйста!
весь весь?
и ресурсный? и resourse.h?
у тебя не скорее всего не определены макросы IDC_BUTPRESS и прочие
из за этого нелегальный case
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 00:22 12
ValeryS, ну не надо бред писать...
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
15.09.2013, 00:34 13
Цитата Сообщение от Qwertiy Посмотреть сообщение
ValeryS, ну не надо бред писать...
интересно в чем бред
ошибку читал "illegal case"
перевести ? "незаконный (нелегальный) case"
а что там в case ?
IDC_BUTPRESS
IDC_BUTCLOSE
это что ? идентификаторы кнопок, макросы
которые у студии определяются в файле resourse.h

это вы тут разогнали за скобки да область видимости
где это в ошибке?
0
833 / 641 / 101
Регистрация: 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 01:04 16
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а посоветовать ... не судьба?
Ну а прочитать
Цитата Сообщение от Qwertiy Посмотреть сообщение
Цитата Сообщение от alsav22 Посмотреть сообщение
В 31 строке скобка лишняя.
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
не судьба?

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

Цитата Сообщение от Qwertiy Посмотреть сообщение
а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря)
Чушь. Объявление переменной — это не оператор (statement), а декларация (declaration). Пруфы в стандарте.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 11:11 19
PS. Моё сообщение следует относить только к языку C.
0
833 / 641 / 101
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2013, 13:25
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru