AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.09.2004, 07:21   #1  
djoker is offline
djoker
Участник
Аватар для djoker
 
83 / 10 (1) +
Регистрация: 28.05.2004
Адрес: Красноярск
? Можно ли исп. switch задать диапазон для case ???
Вопрос такой:
в switch'e в case'ах можно задавать значения как одиночные, так и через запятую,
вопрос а что если их будет например от 1 до 1000 ?
Можно ли указать как-нибудь интервал типа 1..1000 или что-то в этом роде?
Либо придется использовать опртр. If ?

switch( exp ) {
case 1: ...break;
case 2,3,4: ... break;
default: ... breal;
}
__________________
Смотрим в книгу - видим фигу.
Старый 02.09.2004, 09:49   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Вообще говоря диапазон задается через 2 точки (..). Но это действует для запросов (Query) для задания Range. В явном виде код не компилится, если в switch вставить 2 точки. Посему напрашивается вывод, что данная фича не реализована .
На самом деле в аксапте есть моменты, которые как бы должны работать, но увы..
(для примера update_recordset работает далеко не так, как мог бы предположить чел, работавший с SQL Server).
Старый 02.09.2004, 10:01   #3  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Стандартая фича, из С еще..

Стандартая фича, из С еще..

PHP код:
switch( exp )
{
    case 
1:    .....
                     break;
    case 
2:
    case 
3:
    case 
4:    .......
                      break;
    case 
5:     ..... 
                      break;
default: ... break;

Здесь отрабатываются значения 1, 234, 5 и все остальные.
Старый 02.09.2004, 10:05   #4  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
Цитата:
Здесь отрабатываются значения 1, 234, 5 и все остальные.
Уверен что 234 обработается?
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 02.09.2004, 10:09   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Да, 234 обработается и выполнение свалится в код который написан после 5 (поэтому и ставится break для разделения веток).

2George Nordic:
Да, посыпаю голову пеплом- забыл. Привык к VB-паскалю
Старый 02.09.2004, 10:12   #6  
Prof is offline
Prof
Участник
 
732 / 64 (4) ++++
Регистрация: 18.10.2002
Адрес: Москва
Можно поизвращаться, зависит от задачи
типа (не помню целочисленного деления в аксапте...)
switch (exp div 1000)
{
case 0 : ...break;
case 1: ....break;
}
Старый 02.09.2004, 10:16   #7  
Yuri Safronov is offline
Yuri Safronov
Участник
 
140 / 55 (2) ++++
Регистрация: 21.08.2002
Адрес: Москва
Обработается не после 5, а после default. Я думаю нужно использовать if .
__________________
yurisafronov@mail.ru
skype: y.safronov
Старый 02.09.2004, 10:21   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Сработает.

Хотя, если баловаться с преобразованием в exspression... вдруг результат окажется кратным 256

Фича, как я уже говорил, стандартная. Более того, в Axapta ей рекомедуют пользоваться (в С++, кажется, наоборот - предпочтительнее были конструкции if - else if)

Emum'ы отрабатывает - и ладно

С Уважением,
Георгий.
Старый 02.09.2004, 11:44   #9  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
В случае больших диапазонов, когда перечислять все через запятую слишком накладно,а пользоваться if..else не хочется, можно пойти несколько кривым, но достаточно удобным и "читабельным" путем. Вот пример:
PHP код:
static void Job7(Args _args)
{
    
int a 12;

    
boolean in(anyType _xanyType _startanyType _end)
    {
        return 
_start <= _x && _x <= _end;
    }
    ;

    switch(
true)
    {
        case 
== 1:
            print 
"1"; break;
        case 
== 2:
            print 
"2"; break;
        case 
in(a510):
            print 
"5..10"; break;
        case 
in(a1115):
            print 
"11..15"; break;
    }
    
pause;

За это сообщение автора поблагодарили: MerkurievV (0).
Старый 02.09.2004, 18:23   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ruff - браво! А я маялся как сделать Switch незваисмым от конкретной переменной и конкретного перечисления.

PHP код:
static void Job_Switch(Args _args)
{

    
int a 12b=10;
    ;

    switch(
true)
    {
        case 
== 1:
            print 
"1"; break;
        case 
== 10:
            print 
"b == 10"; break;
        case 
== 2:
            print 
"2"; break;
        case (
a>=&& a<=10):
            print 
"5..10"; break;
        case (
a>=11 && a<=15):
            print 
"11..15"; break;
    }
    
pause;


Т.е. теперь можно не писать кучу вложенных if, а писать один универсальный switch, даже если сравнивать надо разные переменные!
Старый 03.09.2004, 05:13   #11  
djoker is offline
djoker
Участник
Аватар для djoker
 
83 / 10 (1) +
Регистрация: 28.05.2004
Адрес: Красноярск
Thumbs up
Очень интересное решение, спасибо за помощь
__________________
Смотрим в книгу - видим фигу.
Старый 03.09.2004, 10:33   #12  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Отличные идеи.... 3 способа использования case с интервалом значений.

Предлагаю модераторам перенести в "Полезное" или "Базу знаний"

С Уважением,
Георгий.
Старый 03.09.2004, 15:38   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо за рекомендацию.
Спасибо за грамотные ответы.
Старый 09.09.2004, 10:05   #14  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Ruff спасибо... тоже задумывался над проблемой, как в свич заставить проверять выражения... а ларчик так просто открывался... )))
Старый 22.12.2004, 06:47   #15  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Запоздало вставлю свои 5 копеек. Давайте просто сравним два участка кода:

PHP код:
static void Job7(Args _args)
{
    
int a 12;

    
boolean in(anyType _xanyType _startanyType _end)
    {
        return 
_start <= _x && _x <= _end;
    }
    ;

    switch(
true)
    {
        case 
== 1:
            print 
"1"; break;
        case 
== 2:
            print 
"2"; break;
        case 
in(a510):
            print 
"5..10"; break;
        case 
in(a1115):
            print 
"11..15"; break;
    }
    
pause;

с

PHP код:
static void Job7(Args _args)
{
    
int a 12;

    ;

    if ( 
== 
        print 
"1";
    else if ( 
== )
        print 
"2";
    else if ( 
<= a  && <= 10 )
        print 
"5..10";
    else if ( 
11 <= a  && <= 15 )
        print 
"11..15";
    
pause;

Другими словами, условный оператор case выгоден, когда он выглядит короче и понятнее аналогичной по смыслу последовательности if / else if.
НО В C-ПОДОБНЫХ ЯЗЫКАХ ЭТО НЕ ТАК! Во всех.
Поэтому рекомендация не пользоваться case справедлива и для X++. Избегайте case и будет вам счастье.
Старый 22.12.2004, 10:20   #16  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм...
Мне кажется, Х++ - скорее скриптоподобный , чем с-подобный язык... В основе которого положена теория рефакторинга, в которой как раз рекомендуется использовать switch/case для читабельности кода.

Кстати, неплохая тема для новой ветки
Насколько я помню, о чем-то подобном спорили...

С Уважением,
Георгий.
Старый 22.12.2004, 11:04   #17  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано George Nordic
Хм...
Мне кажется, Х++ - скорее скриптоподобный , чем с-подобный язык...
Кстати, а в чём отличие скриптовых языков от интерпретируемых?
Насколько я знаю за скриптовые языки считаются интерпретируемые языки в которых отсутствует типизация переменных - т.е. типы переменных деляться на две ветки - VARIANT и агрегатные. С этой точки зрения X++ типичный интерпретируемый язык в котором проверка синтаксиса программы почему то названа громким словом "компиляция".
Под си-подобными языкоми я имею ввиду языки унаследовавшие синтаксис C/C++, а в этом X++ ничуть не хуже своих соплеменников типа явы или перла.

Цитата:
В основе которого положена теория рефакторинга,
Рефакторинг в основу языка не заложен, он заложен в код который на языке программируют. Причём X++ это или C++ значения не имеет.

Цитата:
в которой как раз рекомендуется использовать switch/case для читабельности кода.
Вот я (и не только я) как раз и не считаю что в сиподобных языках switch чем то лучше if / else в плане читабельности кода - пример приведен постом выше. Главное отступы и пробелы в нужных местах. Если кому то ломы писать на пару символов больше в условиях else if ( a == SomeConst ) когда можно просто написать case SomeConst: пусть вспомнит что за это есть плата - в каждом case приходится писать на одну инструкцию больше (имею ввиду break).
Поэтому еще раз повторяю - в сиподобных языках у конструкции switch нет никаких преимуществ перед конструкцией if / else, ни по читабельности ни даже по кол-ву символов которые нужно писать в коде для реализации того или иного решения.
Посмотрите еще раз на извращение с switch ( true ) - - прикольное конечно же решение не спорю, но вводить ф-ю (пусть даже глобальную) ради того чтобы написать
PHP код:
switch ( true )
{
...
case 
in(a510):
...
break 
вместо
PHP код:
else if ( <= && <= 10 
{ ... } 
- ОНО ТОГО НЕ СТОИТ
Минус switch-а состоит в ограниченности применения - хотя с помощью switch ( true ) можно добится любого поведения, но ценность switch-а для читаемости кода и состоит именно в том что он сообщает программисту что далее идут проверки на строгое равенство выражения в switch() с константами.

P.S.
И еще одно - согласно принципам рефакторинга (немногое что я успел вычитать в ссылке, которую давал mazzy) конструкции switch( ... ) в коде надо устранять заменяя полиморфизмом в ООП.
Старый 24.12.2004, 03:21   #18  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Изначально опубликовано Alks
С этой точки зрения X++ типичный интерпретируемый язык в котором проверка синтаксиса программы почему то названа громким словом "компиляция".
Ну, не смешно. В свое время спросил Эрика Дамгарда, создает ли Аксапта при компиляции промежуточный байт-код, на что был ответ: создает. За счет этого можно воспроизвести следующий фокус: программно удалить код метода без перекомпиляции, а система продолжит исполняться. До следующей попытки компиляции уже не существующего исходного кода.

Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных.

И..., господа, проще надо быть с рефакторингом Есть проблемы и поважнее, чем сравнение двух несчастных операторов.
Старый 24.12.2004, 12:56   #19  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Изначально опубликовано Alks

Посмотрите еще раз на извращение с switch ( true ) - - прикольное конечно же решение не спорю, но вводить ф-ю (пусть даже глобальную) ради того чтобы написать
... - ОНО ТОГО НЕ СТОИТ
Нет, ну вот привязался! (с)
Не нравится - не ешь! Меня вот, например, коробит от словосочетания else if почти так же, как от goto Но это - дело моего вкуса... При этом switch (true) сам использовал в жизни 1 или 2 раза! И что с того? Люди спросили, я посоветовал, а "рекомендуется, не рекомендуется" - это уже лирика.
Функцию вообще чисто для красоты добавил (пример-то высосан из пальца)... Хотя, вот сейчас даже придумал одно преимущество ее использования: представьте, что в какой-то момент нужно поменять логику таким образом, чтобы крайние значения не включались в диапазоны! И при этом имеем switch на пару десятков case-ов (или пару десятков else if, кому как нравится). Вот и функция пригодится...

Цитата:
Есть проблемы и поважнее, чем сравнение двух несчастных операторов
Согласен на 100%.
Старый 25.12.2004, 18:49   #20  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано EVGL
[B]
Ну, не смешно. В свое время спросил Эрика Дамгарда, создает ли Аксапта при компиляции промежуточный байт-код, на что был ответ: создает. За счет этого можно воспроизвести следующий фокус: программно удалить код метода без перекомпиляции, а система продолжит исполняться. До следующей попытки компиляции уже не существующего исходного кода.
Хм... Vusal Basic еще чёрт знает каких версий использовал тот же самый подхход. Более того - Spectrum Basiсиспольезовал его в энные годы. ОДНАКО НИКТО ДО СИХ ПОР НЕ СМЕЕТ НАЗВАТЬ BASIC КОМПИЛЯТОРОМ.

Цитата:
Еще одно косвенное доказательство - необходимость "компиляции вперед" при добавлении новой переменной класса-родителя; в противном случае в классе-наследнике начинаются проблемы, сходные с утечкой памяти при использовании указателей в Си. Очевидно, при компиляции класса система рассчитывает и фиксирует объем памяти, нужной для хранения переменных.
Согласен с тем что не имею понятия со всеми теми вещами, которые X++ интерпретатор творит в моментт т.н. "компиляции", но не сомневаюсь что к истинной компиляции сии процессы отношения не имеют.
Теги
switch, диапазон условий, интерпретатор, компилятор, полезное, программирование, разработка, условный оператор

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX UK: Additional Customer Case studies for AX 2009 Blog bot DAX Blogs 1 01.04.2009 07:41
Книга Покупок можно ли не закрывать? asabin DAX: Функционал 1 18.11.2005 17:50
Можно ли в инамическом запросе использовать "group by"? yooshi DAX: Программирование 26 23.09.2005 16:35
Как задать высоту строки в гриде в символах. Logger DAX: Программирование 8 11.08.2005 13:03
Можно ли поменять налоговый код по проведенной закупке или накладной поставщика Голова 2уха DAX: Функционал 1 25.10.2004 11:51

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:35.