Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

что не так ?(+switch)

66K
20 мая 2011 года
rowlot
9 / / 18.03.2011
Доброго времени суток ..
не поможете разобраться ...
какой параметр принимает switch() в данном случае ?

Код:
#include <stdio.h>
#include <stdlib.h>
struct {
  unsigned a:1;
  unsigned b:1;
  unsigned c:1;
}flags;

int main(){
  int o1;
  char o3;
  char o2;
  printf("введите сумму:");
  scanf("%d",&o1);
  if (o1<1000)  flags.a=1;
  else flags.a=0;
  // printf("%d",flags.a);                                                                                                                            

  printf("Клиент задолжник?/n");
  o2= getchar();
  if (o2=='y') flags.b=0;
  else flags.b=1;
   printf("Это постоянный клиент?/n");
  o3= getchar();
  if (o3=='y') flags.c=1;
  else flags.c=0;

  printf("%i %i %i",flags.a,flags.b,flags.c);
  switch(flags){  
   case 000: printf("не делать скидки\n"); break;
   case 111: printf("скидка- 9 процентов"); break;
   case 110: printf("скидка- 8 процентов"); break;
   case 101: printf("скидка- 6 процентов"); break;
   case 100: printf("скидка- 5 процентов"); break;
   case 011: printf("скидка- 4 процента "); break;
   case 010: printf("скидка- 3 процента "); break;
   case 001: printf("скидка- 1 процент  "); break;
          }
}


ps: посоветуйте хороший отладчик ,или хорошую документацию по gdb.

Заранее спасибо
278
20 мая 2011 года
Alexander92
1.1K / / 04.08.2008
switch() не может принимать на вход структуру, коей являются ваши флаги. Вам нужно сделать что-то в таком стиле:
 
Код:
struct {
 unsigned int a : 1;
 unsigned int b : 1;
 unsigned int c : 1;
 short toInt() {
   return (a << 2) | (b << 1) | c;
 }
} flags;

И вызывать соответственно
Код:
switch (flags.toInt()) {
  case 0:     // 000
   // ...
  case 1:     // 001
   // ...
  case 2:     // 010
   // ...
  case 3:     // 011
   // ...
  case 4:     // 100
   // ...
  case 5:     // 101
   // ...
  case 6:     // 110
   // ...
  case 7:     // 111
   // ...
}
14
20 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: rowlot

ps: посоветуйте хороший отладчик ,или хорошую документацию по gdb.


Отладчик для какой ОС?
По gdb лучшее - в сети. Много где...

66K
21 мая 2011 года
rowlot
9 / / 18.03.2011
Alexander92
Cпасибо ,но функции (что в структуре) чего-то не хватает
expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token
непонятно ...

Phodopus
для linux (Debian);
использую gdb ,но мои познания ограничены запуском (run), просто нужды не было его изучать ,до сих пор...
316
21 мая 2011 года
Alm3n
889 / / 29.05.2009
Цитата:

или хорошую документацию по gdb


http://mitya.pp.ru/gdb/gdb_toc.html
еще у Криса Касперски в Искусстве Дизассемблирования неплохо описана работа с GDB.

278
21 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: rowlot
Alexander92
Cпасибо ,но функции (что в структуре) чего-то не хватает
expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token
непонятно ...



В какой среде вы работаете? Я специально проверил в MSVS 2008 и BCC 5.5, никаких ошибок не увидел. Привожу полный код своего теста на всякий случай, сравните со своим:

Код:
#include <stdio.h>

typedef struct {
 unsigned int a : 1;
 unsigned int b : 1;
 unsigned int c : 1;
 short toInt() {
  return (a << 2) | (b << 1) | c;
 }
} FLAGS, *LPFLAGS;

int main(void) {
 FLAGS flags;
 flags.a = 1;
 flags.b = 0;
 flags.c = 1;
 printf("%d\n", flags.toInt());
 return 0;
}
66K
21 мая 2011 года
rowlot
9 / / 18.03.2011
использую gcc / cc

оба выдали следующее:_____
cc -o ne new.c
new.c:3:1: error: stray ‘`’ in program
new.c:8:17: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token
new.c: In function ‘main’:
new.c:18:23: error: ‘FLAGS’ has no member named ‘toInt’
____
gcc version 4.6.1

Наверное после обновление что-то не то ...
Попробую откатить версию...
278
21 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Вариант №1.
Компилируйте через g++, а не через gcc. В программе использованы возможности C++, а не чистого C.

Вариант №2.
Если хотите оставаться рамках чистого C - вынесите функцию отдельно:
Код:
#include <stdio.h>

typedef struct {
 unsigned int a : 1;
 unsigned int b : 1;
 unsigned int c : 1;
} FLAGS, *LPFLAGS;

short FlagsToShort(LPFLAGS lpFlags);

int main(void) {
 FLAGS flags;
 flags.a = 1;
 flags.b = 0;
 flags.c = 1;
 printf("%d\n", FlagsToShort(&flags));
 return 0;
}

short FlagsToShort(LPFLAGS lpFlags) {
  return (lpFlags->a << 2) | (lpFlags->b << 1) | lpFlags->c;
}
66K
22 мая 2011 года
rowlot
9 / / 18.03.2011
Alexander92
разобрался с компиляторами ...(зря откат делал..)

switch(FlagsToShort(&flags)){
case : '101' для выбора как представить это в виде short ;
}
278
22 мая 2011 года
Alexander92
1.1K / / 04.08.2008
Ну писал же выше.

Код:
switch (FlagsToShort(&flags)) {
  case 0:     // 000
   // ...
  case 1:     // 001
   // ...
  case 2:     // 010
   // ...
  case 3:     // 011
   // ...
  case 4:     // 100
   // ...
  case 5:     // 101
   // ...
  case 6:     // 110
   // ...
  case 7:     // 111
   // ...
}
66K
22 мая 2011 года
rowlot
9 / / 18.03.2011
ааа .. все спасибо разобрался ...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог