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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.06.2005, 15:05   #1  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Баг в X++ - передача container в методы
Столкнулся с проблемой.
В общем, вкратце ситуация такова - при вызове метода с параметров типа container, такие параметры передаются только для чтения.
За примером далеко ходить не надо.

Вот класс c рекурсивным статическим методом. Если заменить параметры на int - посчитает до 10ти. Если с контейнером - зациклится, выдавая 1. Аксапта 3 SP3 CU1.
PHP код:
class Class1 
{
}
static 
container m(container c)
{
    ;
    
conpoke(c,1,conpeek(c,1)+1); // conins(c,1,conpeek(c,1)+1); - эффект тот же
    
box::info(conpeek(c,1));
    if (
conpeek(c,1)>10)
        return 
c;
    else {
        return 
Class1::m(c);
    }

Вызывающий Job:
PHP код:
static void Job1(Args _args)
{
    ;
    
Class1::m([1]);

P.S. Кстати, нашел еще одну забавную багу компилятора с определением прототипа рекурсивной функции при изменении кол-ва её аргументов... но это мелочи.
Старый 27.06.2005, 15:17   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
ИМХО, это не бага.

container является примитивным типом. Как и все переменные примитивных типов, переменные типа container передаются по значению.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 27.06.2005, 15:19   #3  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Да на здоровье, пускай передаются.
Оно локально в методе не даёт изменить переданный параметр.
Передача по значению не означает то, что переданный параметр невозможно изменить внутри метода, которому передали этот параметр.

Посмотрите состояние переменной c до и после conpoke...
Старый 27.06.2005, 15:35   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Контейнеры нельзя изменять вообще. Замените conPoke на с=conPoke
Старый 27.06.2005, 15:40   #5  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
А функции con... к чему? Для красоты прикручены?
Вообще, забавно - тип данных есть, а изменять его нельзя...
По идее, он тогда const должен называться...

Насчет замены. А если у меня в контейнере сто элементов?
В цикле в новый копировать? Потому что если впрямую присвоить, скажем

PHP код:
    container c2;
    ;
    
c2=c;
    
conpoke(c2,1,conpeek(c,1)+1);
    
box::info(conpeek(c2,1));
    if (
conpeek(c2,1)>10)
        return 
c2;
    else {
        return 
Class1::m(c2);
    } 
, то копия c2 - становится тоже read-only.

P.S. Богатая справка на сайте, не хуже, чем в Аксапте...
Баннеропоказы/клики зарабатываем?
Старый 27.06.2005, 15:44   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
А функции con... к чему?
чтобы создавать новые контейнеры.

Цитата:
Богатая справка на сайте, не хуже, чем в Аксапте... ))))
Баннеропоказы/клики зарабатываем? )
Контрибуторов.
Старый 27.06.2005, 15:50   #7  
bagyr is offline
bagyr
Участник
 
74 / 10 (1) +
Регистрация: 15.02.2005
Адрес: Томск
PHP код:
container c2;
    ;
    
с2 conpoke(c2,1,conpeek(c,1)+1);
    
box::info(conpeek(c2,1));
    if (
conpeek(c2,1)>10)
        return 
c2;
    else {
        return 
Class1::m(c2);
    } 
попробуйте так
Старый 27.06.2005, 15:51   #8  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Еще интересный эффект - создаем контейнер (by belougin)
PHP код:
    container c2;
    
int t;
    ;
    
t=conpeek(c,1);
    
conins(c2,1,t+1);
    
box::info(conpeek(c2,1));
    if (
conpeek(c2,1)>10)
        return 
c2;
    else {
        return 
Class1::m(c2);
    } 
Результат - в с2 ничего. Пусто. :-\

Готово, Василий Иванович.
Старый 27.06.2005, 15:53   #9  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
2 bagir.

Пробовал, результат монопенисуален.
с2 становится read-only.

Похоже, здесь какой-то глюк с распределением памяти/управлением объектами типа container....
Старый 27.06.2005, 15:54   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
еще есть Array, List, Set, временная таблица
Старый 27.06.2005, 15:56   #11  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А хотелось-бы все-таки контейнер, раз уж такой тип есть.
Старый 27.06.2005, 16:00   #12  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
В общем говоря - баг налицо, о чем изначально и был пост.
Что можно сделать в обход - это само собой разумеется.
Старый 27.06.2005, 16:01   #13  
bagyr is offline
bagyr
Участник
 
74 / 10 (1) +
Регистрация: 15.02.2005
Адрес: Томск
ничего не понимаю
у меня Ax3.0SP3, всё работает нормально
PHP код:
static container cont(container c2)
{
    ;
    
c2 conpoke(c2,1,conpeek(c2,1)+1);
    
box::info(conpeek(c2,1));
    if (
conpeek(c2,1)==10)
        return 
c2;
    else {
        return 
FinderDeleted::cont(c2);
    }

Старый 27.06.2005, 16:02   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
conins(c2,1,t+1); создает новый контейнер - копию со вставленным элементом и возвращает его. Если резщультат функции никуда не девать, ее использовать бессмысленно
PHP код:
static void Test_container(Args _args)
{
    
container m(container c)
    {
    ;
    
c=conPoke(c,1,conpeek(c,1)+1);
    
box::info(conPeek(c,1));
    if (
conPeek(c,1)>10)
        return 
c;
    else {
        return 
m(c);
    }
    }
    ;
    
m([1]);

Старый 27.06.2005, 16:11   #16  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
#&##@!!!
Блин, запарка косит наши ряды...
Оно ж _возвращает_ изменённый контейнер, ёклмн...
Сто лет контейнерами не баловался - и вот приехал.
Старый 27.06.2005, 16:15   #17  
bagyr is offline
bagyr
Участник
 
74 / 10 (1) +
Регистрация: 15.02.2005
Адрес: Томск
Понял, человек просто запутался, он думает, что контейнерные функции правят тот контейнер, который передаётся в параметрах. Наверное проглядел, что контейнерные функции возвращают новый контейнер (как бы изменённый старый).
Старый 27.06.2005, 16:35   #18  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Собственно, речь об этом изначально и была.

container - тип примитивный!
больше всего он похож на str.
И он всегда передается по значению.

Если вы в conins() передаете контейнер по значению, то получить измененный контейнер вы можете только как результат функции.

Вспомните для примера функции strdel(), strins() и т.п.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 27.06.2005, 16:38   #19  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Мля, ну всё, всё, запарили... началось тут чтение истин...
Не обратил внимание, что функция еще и возвращает что-то.
Старый 27.06.2005, 17:43   #20  
axLog is offline
axLog
Участник
 
286 / 10 (1) +
Регистрация: 01.03.2004
PS "Тип передается по.." - это вообще не по-русски. Плохой перевод. Поэтому отчасти и воспринимается с трудом, о чем собственно речь.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
gatesasbait: Quicksort on a container Blog bot DAX Blogs 1 16.12.2007 13:35
SysUsersOnlineHolder - баг в 3.0 kashperuk DAX: База знаний и проекты 0 14.08.2007 16:58
Найти display методы MrVisual DAX: Программирование 12 15.05.2007 09:53
axaptapedia: Container Blog bot DAX Blogs 0 06.03.2007 00:33
Dynamics AX Geek: Storing objects in a container Blog bot DAX Blogs 0 28.10.2006 16:40

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

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

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