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

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

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

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

13.09.2013, 13:54. Просмотров 1229. Ответов 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 (C++):

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

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

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

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

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

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

35
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 01:04 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а посоветовать ... не судьба?
Ну а прочитать
Цитата Сообщение от Qwertiy Посмотреть сообщение
Цитата Сообщение от alsav22 Посмотреть сообщение
В 31 строке скобка лишняя.
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
не судьба?

Добавлено через 1 минуту
А вообще, изначально я ответил чисто по тексту ошибки, не рассматривая код. Потому что такая ошибка с переменной в case абсолютно очевидна.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 04:56 #17
Цитата Сообщение от Qwertiy Посмотреть сообщение
Она не лишняя. Для неё нужна парная между 7й и 8й строками.
Вы дальше пост прочтите:
Цитата Сообщение от alsav22 Посмотреть сообщение
обавлено через 2 минуты
Вообще со скобками непонятно. Скобки прверяйте.
И потом (чтобы понять конкретно, в чём там дело, а не ясновидением заниматься):
Цитата Сообщение от alsav22 Посмотреть сообщение
Весь код давайте.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 05:13 #18
Цитата Сообщение от Qwertiy Посмотреть сообщение
Всё равно не скомпилируется.
Скомпилируется:
Ошибка с оператором switch
Цитата Сообщение от Qwertiy Посмотреть сообщение
а не в разнице между оператором и объявлением переменной (которое тоже оператор, кстати говоря)
Чушь. Объявление переменной — это не оператор (statement), а декларация (declaration). Пруфы в стандарте.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 11:11 #19
PS. Моё сообщение следует относить только к языку C.
0
Qwertiy
821 / 629 / 75
Регистрация: 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
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 13:33 #21
Цитата Сообщение от Qwertiy Посмотреть сообщение
Я говорил о Си++.
Только ты прокомментировал моё сообщение, которое мало того, что было в другой теме, но относилось именно к языку C (моя вина, я этого в той теме сразу явно не указал).

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

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

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

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

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

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

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

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

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

Цитата Сообщение от Qwertiy Посмотреть сообщение
Известно, что в си переменные должны быть объявлены в начале блока
Уже 14 лет, как не должны быть.
0
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,524
15.09.2013, 15:57 #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: синтаксическая ошибка: отсутствие ";" перед "тип"
а без пустого оператора всё нормально.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 16:02 #27
Цитата Сообщение от Qwertiy Посмотреть сообщение
VS2010 не компилирует этот код:
Цитата Сообщение от Qwertiy Посмотреть сообщение
а в VS не компилируется, то при чём тут между языками?
А кто говорил, что в VS есть нормальная поддержка C(99)? Я такого не утверждал.

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

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

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

Цитата Сообщение от Nameless One Посмотреть сообщение
Читать до просветления:
Моя фраза относилось к
Цитата Сообщение от Nameless One Посмотреть сообщение
с бекпортом отдельных фич в их реализацию C90
В смысле что можно было бы и перенести в Си...
0
15.09.2013, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 23:24
Привет! Вот еще темы с ответами:

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

Ошибка с оператором - C++
Ребят помогите не могу вдуплить только начал изучать С++ и при написании программы посчета слов в файле выдает ошибку (недопустимый else...

Error C2679. Ошибка с оператором >> - C++
Есть функция DelColl в классе Firm. Вот её кусок: //Удаление сотрудника void Firm::DelColl(int _Quant) { Quant = _Quant; char...

ошибка с оператором множественного выбора - C++
здравствуйте, форумчане. вот код реализации очереди: #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...


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

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

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