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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.04.2010, 11:50   #1  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Всем огромное спасибо. Подтвердили мои сомнения - архитектура передачи по значению не позволяет определять EDT передаваемых данных.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 28.04.2010, 16:11   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
при присвоении переменный, имеющих один базовый тип никаких приведений не требуется (upd. единственно, для строк действует ограничение на длину - лишнее отбрасывается).
В свете перехода на CLR и от этого "обрезания" собираются отказаться.
Цитата:
Сообщение от Sergey Petrov Посмотреть сообщение
Всем огромное спасибо. Подтвердили мои сомнения - архитектура передачи по значению не позволяет определять EDT передаваемых данных.
Более того, передаваться исходно могут вообще данные не того типа, какой вы ожидаете. Например:
X++:
void foo(InventQty _qty)
{
    // ...
}
void bar()
{
    this.foo( 0 );  // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT...
}
При этом приведением типов Аксапта занимается лишь в момент, когда необходимо "вычислить" значение какого-либо выражения с использованием переданного аргумента. Это обсуждалось в теме axaptapedia: Trap typecast.
По-моему, если нужно передавать не просто значение параметра, но и некую дополнительную семантику, связанную с этим значением, то проще и надежнее это реализовать за счет дополнительного параметра-enum'а.
Старый 28.04.2010, 19:42   #3  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
Цитата:
Сообщение от gl00mie Посмотреть сообщение
По-моему, если нужно передавать не просто значение параметра, но и некую дополнительную семантику, связанную с этим значением, то проще и надежнее это реализовать за счет дополнительного параметра-enum'а.
Я изначально так и предполагал сделать. В результате, после обсуждения, не обнаружив более красивого решения, так и сделал.
Спасибо за ссылки. Учту.
__________________
MS Dynamics AX 2009

Kernel 5.0.1600.4110
Application 5.0.1500.6491
Старый 29.04.2010, 10:06   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Более того, передаваться исходно могут вообще данные не того типа, какой вы ожидаете. Например:
X++:
void foo(InventQty _qty)
{
    // ...
}
void bar()
{
    this.foo( 0 );  // здесь передается аргумент типа int, а не real! какие уж там тонкие отличия EDT...
}
При этом приведением типов Аксапта занимается лишь в момент, когда необходимо "вычислить" значение какого-либо выражения с использованием переданного аргумента. Это обсуждалось в теме axaptapedia: Trap typecast.
Вот это совсем не понял.
В момент вызова функции foo() происходит преобразование из int в real и в параметре _qty хранится число в формате плавающей точки

По ссылке, на мой взгляд, показан пример некорректного приведения типов int64->boolean (точнее int64->Enum. Хотя, для boolean выполняется дополнительное преобразование).
Причем, при возврате из функции значения целочисленного типа, в том числе и литерала, приведение идет не к типу Boolean (Enum с Id=0xF000), а к некоему промежуточному енуму с Id = 0x0000 значения которого находятся в диапазоне 0..255.
X++:
Int   i;
boolean test()
{
    return 0x10000000;
}
;
i = test();
info( strfmt('%1', i) );
__________________
Axapta v.3.0 sp5 kr2
Теги
edt, параметры, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно ли программно определить, какая форма активная? Dima_Dima DAX: Программирование 17 19.09.2014 08:55
Как программно определить поля с выбранными галками (печать под итогов)? miaa DAX: Программирование 1 15.09.2006 10:00
Тип проекта if_maks DAX: Программирование 0 20.08.2004 14:30
Никак не могу вьехать, для чего нужны тип счета и тип разноски maloy DAX: Функционал 5 28.03.2004 17:18
Как определить тип Exception DenisS DAX: Программирование 0 25.12.2003 16:53

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

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

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