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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.05.2012, 10:26   #1  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Job - Интересное наблюдение
Добрый день!

Случайно заметил странное поведение. Создаем такой джоб:
X++:
static void testFunction(Args _args)
{
    boolean check()
    {
        boolean ret = true;
        ;
 
    }
    ;
        
    if(check())
        info(strfmt("true"));
    else
        info(strfmt("false"));
}
При компилляции получаем сообщение "Функция никогда не возвращает значение", но если этот джоб запустить - он работает!

Если бы это был класс, и check() был бы отдельным булевским методом, не возвращающим значение - система всегда вылетала бы в отладчик с сообщением: "Функция никогда не возвращает значение"

Понятно что это не по BestPractice, но я всегда думал что функции внутри методов обрабатываются также, как отдельные методы. Выходит что нет.

Проверял на DAX 4.0
За это сообщение автора поблагодарили: lev (2), S.Kuskov (3), JeS (1), Dark Light (1).
Старый 15.05.2012, 10:38   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
в AX2009 тоже самое
Старый 15.05.2012, 10:41   #3  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Занятно. В 5ке также. А если сделать так

X++:
static void testFunction(Args _args)
{
    str check()
    {
 
    }
    ;
        
    info(check());
}
то вернет "0". Видимо, в случае отсутствия return'а в локальной функции возвращается 0, который преобразуется в соотв. тип.
За это сообщение автора поблагодарили: S.Kuskov (2), kornix (1).
Старый 15.05.2012, 10:45   #4  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
4.0.2501.116
Все компилится и запускается.
а если подредактировать так

X++:
static void testFunction(Args _args)
{
    boolean check()
    {
        boolean ret = true;
        return ret;
 
    }
    ;
        
    if(check())
        info(strfmt("true"));
    else
        info(strfmt("false"));
}
причина отсутствие return
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 15.05.2012 в 10:49.
За это сообщение автора поблагодарили: S.Kuskov (0).
Старый 15.05.2012, 10:51   #5  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Еще интересней:

X++:
static void testFunction(Args _args)
{
    boolean check()
    {
        ;
        
        return 3;
    }
    ;
        
    info(strfmt("%1", check()));
}
Результат 3

Каким образом логическая функция может вернуть что-то отличное от 0 или 1?

Последний раз редактировалось kornix; 15.05.2012 в 10:57.
Старый 15.05.2012, 10:56   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
в аксапте булевый тип - это enum, а enum в аксапте - это int. Воот
X++:
    print typeof(true);
    print typeof(boolean::true);
    pause;
За это сообщение автора поблагодарили: kornix (3).
Старый 15.05.2012, 11:04   #7  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
я бы даже так сказал. При преобразовании int в boolean. Все что не 0 true, 0 это false.
Это во многих языках так.

PS Извиняюсь, что вмешался в процесс взаимоодобрения и воодушевления
__________________
Axapta book for developer
Старый 15.05.2012, 11:06   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от MikeR Посмотреть сообщение
4.0.2501.116
Все компилится и запускается.
...
причина отсутствие return
Так про то и речь, что возврата в функции нет, а джоб все равно запускается и даже что то там работает, хоть и компилится с ошибкой
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 15.05.2012, 11:09   #9  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от lev Посмотреть сообщение
Так про то и речь, что возврата в функции нет, а джоб все равно запускается и даже что то там работает, хоть и компилится с ошибкой
Ну так return же нет, поэтому не знает что возвращать, поэтому возвращает false. Повторюсь у меня компилится нормально.
__________________
Axapta book for developer
Старый 15.05.2012, 11:10   #10  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
в аксапте булевый тип - это enum, а enum в аксапте - это int
Да, действительно..
Но почему-то код ниже возвращает 182

X++:
static void testFunction(Args _args)
{
    boolean check()
    {
        ;
        return 54654654646;
    }
    ;
        
    info(strfmt("%1", check()));
}
Старый 15.05.2012, 11:11   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от MikeR Посмотреть сообщение
Ну так return же нет, поэтому не знает что возвращать, поэтому возвращает false.
А должен вызвать исключение. Как это например происходит если return забыть в методе класса, а не в локальной функции.
Старый 15.05.2012, 11:12   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kornix Посмотреть сообщение
Но почему-то код ниже возвращает 182
X++:
info(int2str(54654654646 mod 256));
или даже так:
X++:
info(int2str(54654654646 & 255));

Последний раз редактировалось S.Kuskov; 15.05.2012 в 11:22.
Старый 15.05.2012, 11:16   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kornix Посмотреть сообщение
Результат 3
Интересно что явное присваивание переменной типизирует значение корректно, в отличии от просто возврата из функции (причём не только из локальной).
X++:
    boolean b;
    boolean check()
    {
        return 3;
    }
    ;
        
    b = check();
    info(strfmt("%1", check()));
    info(strfmt("%1", b));
Старый 15.05.2012, 11:23   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А в 3-ке еще можно было при вызове локального метода обязательные значения параметров не указывать и прокатывало
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Performance Improvement on "Multisite activation – Dimension inconsistency clean-up" Job Blog bot DAX Blogs 0 26.11.2010 00:12
paruvella: Dynamics Ax 2009 Workflow - Simple Job to complete the workflow steps Blog bot DAX Blogs 0 10.12.2009 21:06
DeniZone: Import csv job Blog bot DAX Blogs 0 14.05.2009 20:05
Как передать параметр из Job-a в Class с возможностью перезаписи? Yury J DAX: Программирование 14 11.01.2009 17:11
Глючит Job и TreeNode Alex_KD DAX: Программирование 0 29.08.2007 11:00

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

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

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