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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.04.2011, 09:14   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно.
вот правильный пример - обратите внимание на типы значений в окошках, которые показывают содержимое контейнера.
X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No];
    int len = conlen(con); // вычисляем только один раз!
    int i;
    int j;

    // принимаем значения любого типа
    // однако сравниваем как строки!
    int cmp(anytype a, anytype b)
    {
        // Здесь конечно надо бы возвращать три значения 1; 0; -1
        // но раз уж используем метод пузырька,
        // упрощаем не сильно заморачиваясь по поводу производительности
        // главное - методика сравнение двух anytype значений
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1;  // дает runtime error если внутри контейнера есть контейнер!
                                                                    // дает разные результаты, если выполняется в среде с разными языками
    }
    
    // меняем местами значения внутри контейнера
    void swapIf(int _i, int _j)
    {
        anytype a = conpeek(con, _i); // значения с типом anytype примут тип при первой инициализации
        anytype b = conpeek(con, _j); // повторные присваивания уже не изменят тип переменной anytype,
                                      // поэтому обмен приходится делать в локальном методе
        if( cmp(a, b) > 0 )
        {
            con = conpoke(con, _j, a);
            con = conpoke(con, _i, b);
        }
    }
;
 
    conview(Con,"con: before");

// Sort the container
    for (i = 1; i < len; ++i)
    {
        for (j = i + 1; j <= len; ++j)
        {
            swapif(i, j);
        }
    }
    conview(Con,"con: after");
}
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 306
Размер:	60.2 Кб
ID:	6782  
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 22.04.2011 в 10:33. Причина: добавил инфу о runtime error, и о чувствительности к языку
Старый 22.04.2011, 09:22   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
вот правильный пример
ГЫ! SysQuery::value() ругается, если будут вложенные контейнеры!

X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9, ['inner container', 'with', 4, 'values'],'Ashish singh', NoYes::No];
...
    int cmp(anytype a, anytype b)
    {
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // runtime ошибка!!!!!
    }
...
поэтому методка сравнения anytype переменных по-прежнему не определена.
буду признателен, если кто подскажет
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 09:38   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ГЫ! Даже если нет контейнеров, то порядок установленный при помощи SysQuery::value зависит от используемого языка!
так в русском NoYes::No сортируется как слово "Нет", а при английском языке сортируется как слово "No"

X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9,'Ashish singh', NoYes::No];
...
    int cmp(anytype a, anytype b)
    {
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // результат зависит от языка, в котором работает пользователь
    }
...
поэтому методка сравнения anytype переменных по-прежнему не определена.
буду ОЧЕНЬ признателен, если кто подскажет.

Не то, чтобы это было нужно. Но интересножеж.
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 10:14   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
методка сравнения anytype переменных по-прежнему не определена.
буду ОЧЕНЬ признателен, если кто подскажет.

Не то, чтобы это было нужно. Но интересножеж.
Предлагаю сравнивать значеня побитово .

А если серьёзно, то в чём смысл сортировки ради сортировки? Можно конечно расматривать упорядоченный контейнер как некую его хеш-функцию, котрую потом можно использовать для определения эквивалентности контейнеров. Но решить данную задачу можно и более простыми, и главное более оптимальными способами.

Итого. Считаю возможным решать задачу сортировки разнородных данных, только в контексте конкретной задачи. Тогда выбор методики сравнения будет зависеть от самой задачи, и вообще говоря не будет универсальным, подходящим для других задач.

Если говорить о создании универсального инструмента сортировки контейнера, то универсальным выходом может быть передача предиката сравнения в качестве входного параметра алгоритму сортировки.
Как это реализовать в аксапте - уже другой вопрос Передача функции в качестве параметра
За это сообщение автора поблагодарили: mazzy (2).
Старый 22.04.2011, 10:17   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А если серьёзно, то в чём смысл сортировки ради сортировки?
Разбор моих грехов
Оставьте до поры
Вы оцените красоту игры
(С)
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Container to selectMultiple List using X++ [Dynamics AX] Blog bot DAX Blogs 0 07.04.2011 19:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
dynamics-ax: Official Details about Dynamics AX '6' released, including comments from Microsofts Kees Hertogh Blog bot DAX Blogs 0 11.01.2011 05:22
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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