Показать сообщение отдельно
Старый 24.08.2004, 05:53   #14  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано db


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

PHP код:
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 код:
static void Job9(Args _args)
{
    
int             i = -1;
    
boolean         b;
    while (
!= -1000)
    {
        
i;
        if (! 
i)
        {
            print 
i" "b" !!!";
        }
        
i--;
    }
    
pause;



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

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

Цитата:
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 слоя Аксапты я свою привычку менять не буду.