Цитата:
Изначально опубликовано db
И пятна на солнце бывают и аксапта людьми написана. А хорошо смеется тот, кто смеется последним Вот вам джобик, запустите, а я посмеюсь
PHP код:
static void Job9(Args _args)
{
int i = -1;
boolean b;
while (i != -1000)
{
b = 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 (i != -1000)
{
b = 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 слоя Аксапты я свою привычку менять не буду.