switch(указатель)

Тема в разделе "LANGS.C", создана пользователем simnet_, 28 авг 2008.

  1. simnet_

    simnet_ New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    109
    Есть такой код:
    Код (Text):
    1. int main() {
    2.     int *a=new int;
    3.     int *b=a;
    4.     int *c=new int;
    5.     switch(a) {
    6.         case (b): break;
    7.         case (c): break;
    8.         default: break;
    9.     }
    10.     return 0;
    11. }
    При компиляции cl.exe пишет, что
    Собственно интересует первая строчка отчета cl

    Возможно ли как-то сравнить указатели в таком операторе, не прибегая к if-ам? Есть ли возможность под case'ами ставить не только константы, а и переменные?

    P.S. Интересно, неужели Microsoft'овцам так трудно было разрешить использовать переменные под case? Вроде ассемблерная реализация не сильно усложниться.. Или это следование стандартам?

    [Added] Что-то подсказывает, что так делать нельзя в любом С-компиляторе.. Может тогда существует вариант попроще, чем это монструозное if (a==b) {...} else if (a==c) {...} else if (a==d) {...} else if (a==e) else {...} ?

    Спасибо :)
     
  2. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Если не нравится именно if/else можно так: :)

    Код (Text):
    1. int* a = new int;
    2. int* b = a;
    3. int* c = new int;
    4.  
    5. int ab = (int)a ^ (int)b;
    6. switch (ab)
    7. {
    8. case 0:
    9.     {
    10.     }
    11.     break;
    12. default:
    13.     {
    14.         int ac = (int)a ^ (int)c;
    15.         switch (ac)
    16.         {
    17.         case 0:
    18.             {
    19.             }
    20.             break;
    21.          default:
    22.             {
    23.                 //etc.
    24.             }
    25.             break;
    26.         }
    27.     }
    28.     break;
    29. }
     
  3. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Явное приведение типов пользуй. Перед switch((size_t)a)

    Интересно, а если как С компилировать, не уйдет проблема?
     
  4. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Мм... Не монстро узорное совсем даже. Главное делать отступы разумно, т.е. не делать после каждого else новую накрутку оступа, а использовать else if как один оператор аки в пхп elseif и будет даже не хуже чем со свичем
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    simnet_
    в switch может стоять _только_целая_ переменная или константа.
    после case может стоять _только_целая_константа_. Никаких переменных и т.п.
    (см. С99 6.8.4.2)

    да
     
  6. simnet_

    simnet_ New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    109
    zhindos
    Вы извращенец :)

    Нет, как оказалось это и правда стандарт такой

    Всем большое спасибо, проблему удалось решить с помощью макросов. Если кому-то интересно:
    http://www.rsdn.ru/forum/message/3082122.1.aspx

    Просто хотелось немного стройности спагетти-кода :)