Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
1

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

13.09.2013, 13:54. Показов 3049. Ответов 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
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 13:33 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Qwertiy Посмотреть сообщение
Я говорил о Си++.
Только ты прокомментировал моё сообщение, которое мало того, что было в другой теме, но относилось именно к языку C (моя вина, я этого в той теме сразу явно не указал).

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


Опять же, все подробности — в стандарте языка (C).
0
833 / 641 / 101
Регистрация: 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
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 13:58 23
Цитата Сообщение от Qwertiy Посмотреть сообщение
А вот обсуждаемый код помечен маркером "Код C++".
Дело в том, что большая часть пользователей этого форума путает теги C, CPP, CSHARP, CPPQT, а также разделы, в которых создаются темы, поэтому часто приходится догадываться о происхождении кода по самому коду и/или по контексту. А код в стартовом сообщении именно что сишный (почти стандартный), несмотря на теги, в том смысле, что никаких плюсовых особенностей в нём нет.

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

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

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

Цитата Сообщение от Qwertiy Посмотреть сообщение
Известно, что в си переменные должны быть объявлены в начале блока
Уже 14 лет, как не должны быть.
0
833 / 641 / 101
Регистрация: 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
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.09.2013, 16:02 27
Цитата Сообщение от Qwertiy Посмотреть сообщение
VS2010 не компилирует этот код:
Цитата Сообщение от Qwertiy Посмотреть сообщение
а в VS не компилируется, то при чём тут между языками?
А кто говорил, что в VS есть нормальная поддержка C(99)? Я такого не утверждал.

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

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

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

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

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

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

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

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

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

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

Добавлено через 9 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
Только эти фичи будут нестандартными расширениями компилятора VS
Кстати, у GCC тоже есть куча именно языковых расширений, которые позволяют писать хоть и непереносимые, но такие вещи как libCello (компилируется GCC и Clang).
2
1 / 1 / 0
Регистрация: 09.04.2012
Сообщений: 101
18.09.2013, 12:47  [ТС] 36
большое спасибо за статью
0
18.09.2013, 12:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2013, 12:47
Помогаю со студенческими работами здесь

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

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

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

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


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

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