powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / switch
17 сообщений из 17, страница 1 из 1
switch
    #33906304
Осина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Visual C++ 6.0

Функция получает типа CString
Значения “TN”, “PP”, “BD”
Хочу реализовать оператор switch

void CEnterDaoSDI_testView::DoFilter(CString col)
{

switch (col) // error C2450: switch expression of type 'class CString' is illegal – НЕЗАКОННО CString
{
case "PP":
. . . . . . . . .
break;
case "TN":

break;
case "BD":

break
default:
break;
}
Как обойти ?

СПАСИБО
...
Рейтинг: 0 / 0
switch
    #33906362
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Switch selection expression must be of integral type
1. Передавай в функцию целочисленную переменую...
2. Не испоьлзуй switch
3. сделай функцию для установки соответствия твоим параметрам int'ов
...

После default break не нужен
...
Рейтинг: 0 / 0
switch
    #33906662
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно делают массив ключевых слов, ищут слово в этом массиве и делают switch по индексу ключевого слова. Для удобства еще можно объявить символьные константы (или переменные - константы) для каждого ключевого слова, совпадающие с этим ключевым словом,
как то

Код: plaintext
1.
2.
3.
4.
5.
char *keywords[] = {¨roll¨, ¨dig¨};
#define ROLL  0 
#define DIG  1 

...
...
Рейтинг: 0 / 0
switch
    #33907067
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще извратный способ. Так как у тебя слова из 2-х букв, то можно делать свич по первой букве, и внутри него свич по второй.

Но так никогда не далают, т.к. он не отражает логику программы.
...
Рейтинг: 0 / 0
switch
    #33907724
KOs-ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я лично не знаком с классом CString и не знаю его структуры, но вероятне всего в классе CString не реализованы операторы сравнения.
...
Рейтинг: 0 / 0
switch
    #33907755
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOs-ua почему же, реализованы давным-давно.
...
Рейтинг: 0 / 0
switch
    #33907784
Фотография Paradoxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не использовать
strcmp() и выбросить этот swich{} ??
...
Рейтинг: 0 / 0
switch
    #33907858
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ParadoxxА почему бы не использовать
strcmp() и выбросить этот swich{} ??

автор написал: "Хочу реализовать оператор switch".
...
Рейтинг: 0 / 0
switch
    #33908784
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОсинаVisual C++ 6.0Функция получает типа CString Значения “TN”, “PP”, “BD” Хочу реализовать оператор switch....CString....

Если заглянуть на самый "низ" - ассемблерный код, того что получаеться после свитча...То имеем, что то типа...

1) входное число отработать на ограничение с верху и с низу, привести его к размерности таблицы перехода.
2) перейти по указателю из таблицы перехода...

всё...
другими словами
а) операнды есть ЧИСЛА
б) соответствие "ЧИСЛО" = "КОД обработки" и должно быть ОДНОЗНАЧНО задано.
в) данная операция работает БЫСТРЕЕ чем некоторое кол-во ифов (зависит от кол-ва не успешных сравнений). Продвинутые оптимизаторы сами подсчитывают мопсы и могут заменить свитч на комбинации из последовательных ифов...

Зная это можно:
а) применить не стринговые а числовые коды.
б) использовать MAPы (вроде как там стринги были, если не глючу)
в) использовать подходы описанные выше (повторяться не охота).


с уважением
(круглый)
...
Рейтинг: 0 / 0
switch
    #33909597
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
switch (col) // error C2450: switch expression of type 'class CString' is illegal – НЕЗАКОННО CString
{
case "PP":
. . . . . . . . .
break;
case "TN":

break;
case "BD":

break
default:
break;
} 

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#define XID(x)  int(x[ 0 ]<< 8 )+int(x[ 1 ])

char sw[ 3 ];
strncpy(sw, col.c_str(), sizeof(sw));

switch ( XID(sw) )
{
  case XID("AA"):  break;
  case XID("AB"):  break;
  case XID("AC"):  break;
  case XID("AD"):  break;
  case XID("AE"):  break;
}
...
Рейтинг: 0 / 0
switch
    #33914457
Фотография dudochkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОсинаVisual C++ 6.0

Функция получает типа CString
Значения “TN”, “PP”, “BD”
Хочу реализовать оператор switch

void CEnterDaoSDI_testView::DoFilter(CString col)
{

switch (col) // error C2450: switch expression of type 'class CString' is illegal – НЕЗАКОННО CString
{
case "PP":
. . . . . . . . .
break;
case "TN":

break;
case "BD":

break
default:
break;
}
Как обойти ?

СПАСИБО
...
Рейтинг: 0 / 0
switch
    #33914523
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вообще без switch

Код: plaintext
1.
2.
3.
4.
5.
if(col.Compare("NN")== 0 ) {....}
else if(col.Compare("PP")== 0 ) {....}
else if(col.Compare("BD")== 0 ) {....}
else {/* если не совпало ни одно из значений. аналог  default:
*/}
...
Рейтинг: 0 / 0
switch
    #33914543
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
более нагляден и похож на switch аналог без else if, а с break-ами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
do{
                if(s=="NN") { .....; break;}
                if(s=="PP") { .....; break;}
                if(s=="BD") { .....; break;};
                //default
                ......
}
while(false);
...
Рейтинг: 0 / 0
switch
    #33914619
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
do-while для чего?
...
Рейтинг: 0 / 0
switch
    #33915156
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп: для того, чтобы break исполнялся, иначе будет ругаться, что его без цикла/свитча заюзать пытаются. (break statement not within loop or switch). Но понятно, что цикл - вырожденный, ибо false.
...
Рейтинг: 0 / 0
switch
    #33915194
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOs-uaЯ лично не знаком с классом CString и не знаю его структуры, но вероятне всего в классе CString не реализованы операторы сравнения.

Да будет известно уважаемому, что в языке С++ , равно как и в языке С,
в операторе switch в т.н. метках выбора допускается указывать только КОНСТАНТЫ неинтегрального типа. Т.е. строки там указывать нельзя.
Поэтому оператор == не поможет, поскольку использоваться там он не будет.
...
Рейтинг: 0 / 0
switch
    #33915201
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казалось бы, обычный switch, а народ всё обсуждает и обсуждает :)
Не указали, пожалуй, только enum, который тут, как раз, вполне уместен... Но автору вопроса, похоже, уже всё равно...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / switch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]