AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
Old 24.08.2004, 05:53   #19  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Join Date: 23.07.2004
Location: г. Новокузнецк
Quote:
Изначально опубликовано db


И пятна на солнце бывают и аксапта людьми написана. А хорошо смеется тот, кто смеется последним Вот вам джобик, запустите, а я посмеюсь

PHP Code:
static void Job9(Args _args)
{
    
int             i = -1;
    
boolean         b;
    while (
!= -1000)
    {
        
i;
        if (! 
b)
        {
            print 
i" "b" !!!";
        }
        
i--;
    }

Так что сомневаться бывает очень полезно
Да у меня просто волосы дыбом встали! И ведь по результатам видно что происходит какая то хрень с преобразованием отрицательных чисел кратных 256 - такое ощущение что для них перед преобразованием в boolean сперва идет преобразование в однобайтовое число. Хотел бы я узнать каким алгоритмом пользуются создатели X++ при этом преобразовании что возникает такой нехарактерный глюк. По хорошему a == true на низком уровне должно преобразовываться в a != 0, а a == false в a == 0. Как тут можно допустить исключительные ситуации с отрицательными числами ума просто не приложу!

Однако, я всё таки сейчас поулыбаюсь бледной улыбкаой, сразу после предыдущего попробуйте следующий джобик:

PHP Code:
static void Job9(Args _args)
{
    
int             i = -1;
    
boolean         b;
    while (
!= -1000)
    {
        
i;
        if (! 
i)
        {
            print 
i" "b" !!!";
        }
        
i--;
    }
    
pause;



так что if ( tbl ) вполне корректно.

В подтверждение этому обратите внимание на то что участок кода:

Quote:
inventTable.(fieldnum(Common, RecId)) = -512;

if (inventTable)
{
print "ok";
}
else
{
print "!!!";
}

if (inventTable.RecId && 100 > 4)
{
print "ok";
}
else
{
print "!!!";
}

b = inventTable && 100 > 4;

if (b)
{
print "ok";
}
else
{
print "!!!";
}
Работает тоже совершенно корректно (просто inventTable && 100 > 4 трактуется по приоритету операций как (inventTable && (100 > 4)) это хорошо видно если начать задавать скобки явно), очевидно что проблемы начинаются когда X++ вынужден сохранять результат конвертации int->boolean в явно заданную переменную (возможно так же что и как параметр ф-ии тоже). Спасибо конечно за предупреждение - теперь буду проявлять осторожность при передаче чисел как параметров в ф-ии предполагающие boolean аргумент, но глядя на то сколько сравнений вида if ( tbl ) сидит в недрах sys слоя Аксапты я свою привычку менять не буду.
Tags
recid, баг, ошибка, ax3.0

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
if (record) vs if (record.RecId) kashperuk DAX: Программирование 18 27.11.2008 18:53
Как сформировать RecId Arahnid DAX: Программирование 18 14.07.2008 15:02
поля, содержащие RecId somebody DAX: Программирование 15 16.05.2008 17:50
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 09:32.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.