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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.07.2024, 10:22   #1  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Синтаксис []
Доброго дня, странный затык, поискал в АОТе - примеров не нашёл. Собственно как передать массив в метод?
Если пытаться передать listNum[], то Синтаксическая ошибка.
Если просто lineNum, то Аргумент _listNum несовместим с требуемым типом.
Все компилируется если передать конкретный элемент listNum[1], но хочется-то все
X++:
static void JobArr(Args _args)
{
    Integer     listNum[];
    
    void method(Integer _listNum[])
    {
        Integer     newList[];
        ;

        newList = _listNum;
    }
    ;
    
    listNum[1] = 100;
    listNum[2] = 200;

    method(listNum[]);
}
Старый 26.07.2024, 11:48   #2  
LETTO is offline
LETTO
Участник
 
318 / 64 (3) ++++
Регистрация: 14.07.2022
Да походу в динамический массив аксапта не умеет копировать.
Попробуйте указать
Integer newList[10];
и вызов
method(listNum);
может размер массива передавать первым параметром.
Старый 26.07.2024, 11:57   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
По-моему это нельзя сделать. Или я не знаю как.
Или использовать класс обертку, который и передавать.
Старый 26.07.2024, 15:00   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Аксапта не использует в параметрах передачу значений по ссылке, если только это не объект. Соответственно, о массивах в параметрах не может быть и речи. Поэтому есть два варианта: либо использовать классы коллекций, либо сделать массив локальной переменной класса. Использование .NET типов также не позволяет использовать массивы.
__________________
// no comments
Старый 26.07.2024, 15:57   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Присваивать массивы нельзя, а передавать через параметры можно. Вот так:
X++:
static void Job1210(Args _args)
{
    Integer     listNum[];
    
    void method(Integer _listNum[])
    {
        ;

        info(strFmt("%1", _listNum[1]));
        info(strFmt("%1", _listNum[2]));
    }
    ;
    
    listNum[1] = 100;
    listNum[2] = 200;

    method(listNum);
}
Проверил в AX 2012 и AX 3 - работает одинаково. В CIL не проверял, но вроде пишут, что в CIL может сработать присваивание массивов, но вроде как будет работать как через указатели - изменение одного элемента в копии массива приведет к изменению того же эемента в исходном массиве. X++: X++ Arrays Behave Differently in .NET CIL, in Dynamics AX 2012

Т.е. newList = _listNum без CIL не вызовет ошибки компиляции, но не работает - массив newList останется пустой (я проверил). А внутри CIL скопируется ссылка на исходный массив (я не проверял).
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 26.07.2024 в 16:13.
За это сообщение автора поблагодарили: Logger (7), dech (5).
Старый 26.07.2024, 16:22   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Но если размерность массива одинаковая, то можно не только передавать через параметры, то и присваивать:
X++:
static void Job1210(Args _args)
{
    int     listNum[2];

    void method(int _listNum[])
    {
        int newList[2];
        ;

        newList = _listNum;

        info(strFmt("%1", newList[1]));
        info(strFmt("%1", newList[2]));
    }
    ;

    listNum[1] = 100;
    listNum[2] = 200;

    method(listNum);
}
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 26.07.2024, 16:24   #7  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Причем массив именно копируется при присваивании, а не передается по ссылке:

X++:
static void Job1210(Args _args)
{
    int     listNum[2];

    void method(int _listNum[])
    {
        int newList[2];
        ;

        newList = _listNum;

        newList[2] = 55;

        info(strFmt("%1", newList[1]));
        info(strFmt("%1", newList[2]));
        info(strFmt("%1", _listNum[2]));
    }
    ;

    listNum[1] = 100;
    listNum[2] = 200;

    method(listNum);
}
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 27.07.2024, 09:38   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Конечно в Аксапте нативно поддерживается работа со статическими массивами. Вспомните Dimension. Его можно и присваивать и передавать в качестве параметра. Можно делать массивы полей в таблице (через соответствующие EDT). Такие массивы поддерживаются и в предложениях select и в group by.
Старый 29.07.2024, 11:43   #9  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
300 / 866 (29) +++++++
Регистрация: 23.10.2012
Добрый день.
Почему не контейнер? Так же не любит менять размерность. Такой же быстрый доступ по индексу. Те же накладные расходы при передаче в виде параметра. С точки зрения расположения в оперативке - одно и тоже.
Старый 29.07.2024, 12:57   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Товарищ ♂uatr Посмотреть сообщение
Такой же быстрый доступ по индексу.
Вроде в p-code всегда был медленный доступ по индексу.
Хотя возможно в последних версиях поменяли что-то.
Старый 30.07.2024, 00:44   #11  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
300 / 866 (29) +++++++
Регистрация: 23.10.2012
Цитата:
Сообщение от Logger Посмотреть сообщение
Вроде в p-code всегда был медленный доступ по индексу.
Да, логично, погорячился, это не просто offset. Так понимаю container = обёртка над qlist. Сути особо не меняет, вопрос применения: динамика - list, статика - container.

Последний раз редактировалось Товарищ ♂uatr; 30.07.2024 в 00:47.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Синтаксис для Notepad++ demianimp DAX: Программирование 5 17.11.2016 14:26
Синтаксис запросов в Обозревателе таблицы AXcons DAX: Программирование 5 17.06.2015 11:23
Синтаксис join'а Pegiy DAX: Программирование 4 28.04.2004 12:33
Синтаксис Join Vpooh DAX: Программирование 3 26.09.2003 11:12
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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