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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2011, 10:38   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Несоответствие типов: ожидалось real, а получено int
AX2009. Странное поведение коллекций Set и Array (для коллекции Map не воспроизводиться).
Почему в некоторых случаях не срабатывает неявное приведение типов?
X++:
    Set set = new Set(Types::Real);
    Array array = new Array(Types::Real);
    Map map = new Map(Types::Real, Types::Real);
    ;
    
//  set.add(0);         // Несоответствие типов: ожидалось real, а получено int.
//  array.value(1, 0);  // Несоответствие типов: ожидалось real, а получено int.
    map.insert(0, 0);   // ok
Старый 23.06.2011, 11:10   #2  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Давно привык, там, где использую real и нет дробной части, ставлю после числа точку. Избавляет от подобных глюков.
X++:
set.add(0.);         // ok
array.value(1, 0.);  // ok
map.insert(0., 0.);  // ok
Старый 23.06.2011, 11:25   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
Давно привык, там, где использую real и нет дробной части, ставлю после числа точку. Избавляет от подобных глюков.
Это всё понятно. Можно использовать соответствующие литералы, а в случае переменных можно перед использованием перегнать значение из целочисленной переменной в вещественную. Только ради чего всё это делать? Я не вижу в этом никакого смысла. По-моему, необходимость делать это является следствием бага. Или всё-таки это фича? Тогда в чём её смысл?
Старый 23.06.2011, 11:47   #4  
ShowPoint is offline
ShowPoint
Участник
 
16 / 10 (1) +
Регистрация: 28.07.2005
Адрес: Moscow, Russia
Это не бага, это следствие использования anytype в методах add и value. Компилятор не может сгенерить кастинг, поскольку нужный тип будет известен только при выполнении, и поэтому отдаёт параметр как есть. А классы Set и Array внутри strictly-typed, цитата из хелпа (метод add класса Set):

X++:
The value must be of the same type as the type assigned to the set when it was created.
__________________
SY,
AVA
Старый 23.06.2011, 11:55   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
В третьей Аксапте наблюдается то же самое:
Цитата:
// set.add(0); // Несоответствие типов: ожидалось real, а получено int.
// array.value(1, 0); // Несоответствие типов: ожидалось real, а получено int.
Я думаю, что в коде метода Add() класса Set стоит проверка на тип добавляемого значения (enum Types), для примера:

X++:
static void TestTypesJob(Args _args)
{
    Types       type;
    ;

    type = typeof(0);
    info(enum2str(type));//Integer

    type = typeof(0.0);
    info(enum2str(type));//Real
}
Таким образом, я думаю, что это не баг.
__________________
С уважением, Александр.
Старый 23.06.2011, 11:58   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А по какой причине тогда с коллекцией Map дела обстоят иначе?
Старый 23.06.2011, 12:02   #7  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
А по какой причине тогда с коллекцией Map дела обстоят иначе?
Возможно, по причине наличия в данном классе инверсии (изменения мест) ключа и значения.
__________________
С уважением, Александр.
Старый 23.06.2011, 12:47   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от samolalex Посмотреть сообщение
Возможно, по причине наличия в данном классе инверсии (изменения мест) ключа и значения.
Не понял вас. Можете пояснить?
Старый 23.06.2011, 13:03   #9  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Не понял вас. Можете пояснить?
Пример функции инвертирования (взят из книги Еременко, Шашкова)
X++:
Map invertMap(map _mapToInvert)
{
    mapIterator it;
    map result = new map(_mapToInvert.valueType(), _mapToInvert. keyType()) ;
    if(_mapToInvert.keyset().elements() != _mapToInvert.valueSet().elements())
    {
        return null;
    }
    
    it = new mapIterator(mapToInvert);
    while(it.more())
    {
        result.insert(it.value(), it.key());
        it.next();
    }
    return result;
}
Предположение о причине отсутствия проверки на типы в методах insert() класса Map сделал из того, что ключ и значение могут быть разных типов, и в силу этого в коде данного метода, скорее всего, решили опустить проверку, т.к. сочетаний типов "Ключ - Значение" может быть очень много.
__________________
С уважением, Александр.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
daxsol: Axapta Kernel Functions Blog bot DAX Blogs 1 16.05.2009 19:22
C# and AX Development: Truncated real fields (ex. LineNum) when table is exported as XML Blog bot DAX Blogs 0 07.02.2009 11:05
C# and AX Development: Rounding in AX (real to integer) Blog bot DAX Blogs 0 13.08.2008 01:05
closeDocument(boolean _save = false, int _workBook = 1) Daido DAX: Программирование 1 03.11.2007 09:58
public int messageProc(FormControl _control, int _message, int _wParam, int _lParam) Yuri Safronov DAX: Программирование 2 31.10.2002 19:21

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:38.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.