Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Истина где-то рядом! Помогите ее отыскать?  (Прочитано 11956 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Nevis
Гость
« : 28-04-2005 11:57 » 

Привет знатокам!
Я очень давно не работал с оператором Switch и Case, работал когда мы писали проги под DOS
Сейчас мне нужно чтобы прога определила что написано в одном Label`е и вписала букву в один Edit
Вот код:
Код:
void ShowDay(TEdit *Edit)
{
 switch (Form2->Day->Text)
 {
  case Form2->Day->Text == "Понедельник": Form2->Edit3->Text = "P"; break;
  case Form2->Day->Text == "Вторник": Form2->Edit3->Text = "V"; break;
  case Form2->Day->Text == "Среда": Form2->Edit3->Text = "S"; break;
  case Form2->Day->Text == "Четверг": Form2->Edit3->Text = "C"; break;
  case Form2->Day->Text == "Пятница": Form2->Edit3->Text = "Y"; break;
  case Form2->Day->Text == "Суббота": Form2->Edit3->Text = "U"; break;
  case Form2->Day->Text == "Воскресение": Form2->Edit3->Text = "W"; break;
 }
}
Соответственно, если день вторник, то в Edit3 должно попасть "V", при этом мне компилятор рисует кучу ошибок, не понимаю почему?!

Вот ошибки:
Код:
Build
  [C++ Error] Unit2.cpp(23): E2247 'TControl::Text' is not accessible
  [C++ Error] Unit2.cpp(25): E2313 Constant expression required
  [C++ Error] Unit2.cpp(26): E2313 Constant expression required
  [C++ Error] Unit2.cpp(26): E2172 Duplicate case
  [C++ Error] Unit2.cpp(26): E2188 Expression syntax
  [C++ Error] Unit2.cpp(27): E2313 Constant expression required
  [C++ Error] Unit2.cpp(27): E2172 Duplicate case
  [C++ Error] Unit2.cpp(27): E2188 Expression syntax
  [C++ Error] Unit2.cpp(28): E2313 Constant expression required
  [C++ Error] Unit2.cpp(28): E2172 Duplicate case
  [C++ Error] Unit2.cpp(28): E2188 Expression syntax
  [C++ Error] Unit2.cpp(29): E2313 Constant expression required
  [C++ Error] Unit2.cpp(29): E2172 Duplicate case
  [C++ Error] Unit2.cpp(29): E2188 Expression syntax
  [C++ Error] Unit2.cpp(30): E2313 Constant expression required
  [C++ Error] Unit2.cpp(30): E2172 Duplicate case
  [C++ Error] Unit2.cpp(30): E2188 Expression syntax
  [C++ Error] Unit2.cpp(31): E2313 Constant expression required
  [C++ Error] Unit2.cpp(31): E2172 Duplicate case
  [C++ Error] Unit2.cpp(31): E2188 Expression syntax
  [C++ Error] Unit2.cpp(131): E2451 Undefined symbol 'day'
  [C++ Error] Unit2.cpp(137): E2451 Undefined symbol 'day'
  [C++ Error] Unit2.cpp(143): E2451 Undefined symbol 'day'
  [C++ Error] Unit2.cpp(149): E2451 Undefined symbol 'day'
  [C++ Error] Unit2.cpp(155): E2451 Undefined symbol 'day'
  [C++ Error] Unit2.cpp(155): E2228 Too many error or warning messages
« Последнее редактирование: 03-12-2007 19:07 от Алексей1153++ » Записан
Alf
Гость
« Ответ #1 : 28-04-2005 12:14 » 

Метки case должны представлять собой константы одного из интегральных типов. В данном случае вместо константы предлагается логическое выражение вроде

Код:
Form2->Day->Text == "Понедельник"

, которое не может быть вычислено на этапе компиляции.

Проще всего убрать конструкцию case и заменить ее на что-то вроде

Код:
if (Form2->Day->Text == "Понедельник")
  Form2->Edit3->Text = "P";
else if (Form2->Day->Text == "Вторник")
  Form2->Edit3->Text = "V";
else if  (Form2->Day->Text == "Среда")
  Form2->Edit3->Text = "S";

и так далее.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #2 : 28-04-2005 12:22 » 

убери из проги (можно Replace-ом) "Form2->Day->Text =="

т.е. д.б.
 case "Понедельник": Form2->Edit3->Text = "P"; break;
 case "Вторник": Form2->Edit3->Text = "V"; break;
 case "Среда": Form2->Edit3->Text = "S"; break;
Записан

Удачного всем кодинга! -=x[PooH]x=-
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-04-2005 15:49 » 

Я подозреваю, что сравнение указателей на строки оператором == не то, что нужно.  Скорее всего, надо сравнивать содержимое строк.  В таком случае более подходят функции strcmp/strncmp.

Код:
if (0 == strcmp(Form2->Day->Text, "Понедельник")) {
    Form2->Edit3->Text = "P";
} else if
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Alf
Гость
« Ответ #4 : 28-04-2005 18:51 » 

Давненько уже стер у себя C++ Builder. Однако, насколько помнится, там для хранения строк используется достаточно развитый класс, подобный CString из MFC и ATL. Само собой, оператор сравнения == там переопределен надлежащим образом и не сводится к сравнению указателей.

Возможно, конечно, что я ошибаюсь, столько времени прошло. И все-таки я бы рекомендовал сначала проверить вариант со сравнением. Уж больно неказисто выглядят низкоуровневые строковые функции C в объектно-ориентированном окружении, возможно, удастся обойтись и без них.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #5 : 29-04-2005 04:35 » 

Выражение :
Код:
case Form2->Day->Text == "Понедельник":
НЕ ВЕРНО!
Если я не ошибаюсь, то в операторе case НЕ может быть НИКАКИХ выражений, а ТОЛЬКО какое-то значение.
Т.е. вместо
Код:
switch (Form2->Day->Text)
{
  case Form2->Day->Text == "Понедельник": Form2->Edit3->Text = "P"; break;
Надо писать
Код:
switch (Form2->Day->Text)
{
  case "Понедельник": Form2->Edit3->Text = "P"; break;
потому как в оператор switch ты уже подал значение Form2->Day->Text
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 29-04-2005 05:00 » 

Возможно я ошибся с "case "Понедельник": Form2->Edit3->Text = "P"; break;"

case String("Понедельник"): Form2->Edit3->Text = "P"; break;

точно должно работать.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Alf
Гость
« Ответ #7 : 29-04-2005 06:40 » 

Если я не ошибаюсь, то в операторе case НЕ может быть НИКАКИХ выражений, а ТОЛЬКО какое-то значение.

Не совсем так. Может быть константное выражение, которое можно вычислить на этапе компиляции.
 
Надо писать
Код:
switch (Form2->Day->Text)
{
 case "Понедельник": Form2->Edit3->Text = "P"; break;

А вот это - совершенно неверно. Придется повторить еще раз: константа, используемая как метка case, должна быть интегрального типа. К примеру, "Понедельник" является массивом литерного типа и никоим образом не попадает в число интегральных констант.

Если не верите на слово, вот кусок MSDN:
Цитата
The switch statement allows selection among multiple sections of code, depending on the value of an integral expression.

switch ( expression )
   case constant-expression : statement
   [default  : statement]
The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #8 : 29-04-2005 11:56 » 

А вот это - совершенно неверно. Придется повторить еще раз: константа, используемая как метка case, должна быть интегрального типа. К примеру, "Понедельник" является массивом литерного типа и никоим образом не попадает в число интегральных констант.
Сорри, май мистэйк Улыбаюсь Я привык просто что в ПХП такое проходит Ага
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Alf
Гость
« Ответ #9 : 29-04-2005 12:16 » 

Кстати, и в C# такое также проходит без проблем. Однако в C++ ограничение жесткое, допустимы только интегральные типы или типы, приводимые к интегральным - и все.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #10 : 29-04-2005 14:55 » 

Кстати, и в C# такое также проходит без проблем.

А я как раз последнее время только на ПХП да C# и программирую Улыбаюсь Вот и написал без задней мысли что пройдёт такой финт Улыбаюсь Следующий раз буду внимательнее Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
zQrd
Гость
« Ответ #11 : 17-05-2005 14:55 » 

Nevis, все просто. Нужно использовать такую конструкцию
void ShowDay(TEdit *Edit)
{
switch (Form2->Day->Text)
{
  case "Понедельник": Form2->Edit3->Text = "P"; break;
  case "Вторник": Form2->Edit3->Text = "V"; break;
  case "Среда": Form2->Edit3->Text = "S"; break;
  case "Четверг": Form2->Edit3->Text = "C"; break;
  case "Пятница": Form2->Edit3->Text = "Y"; break;
  case "Суббота": Form2->Edit3->Text = "U"; break;
  case "Воскресение": Form2->Edit3->Text = "W"; break;
}
}

Вот и все!
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 17-05-2005 16:01 » 

zQrd Прочитай еше раз цитату Альфа
Цитата
А вот это - совершенно неверно. Придется повторить еще раз: константа, используемая как метка case, должна быть интегрального типа. К примеру, "Понедельник" является массивом литерного типа и никоим образом не попадает в число интегральных констант.
Можеш поднять также любой учебник по чистому C++. И убедится в правомерности данной фразы. Не работал с Билдером выше 4.5. Но до этой версии в Борланде более или менее придерживались стандартов.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
astat
Гость
« Ответ #13 : 19-05-2005 19:08 » 

короче... меня так учили :
 switch
{
    case значение 1:
        серия 1 ;
        break;
    case серия 2 :
         серия 2;
          break;
   и  т.д   
Ну а потом если захочешь то мона поставить
   default :
     серия значений ;
}
  Мне на енту тему задали писать прогу.... я вроде так усё написал..
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines