Кто нить может объяснить сей феномен (C5ee-b):
PROGRAM MAP ChangeValue(*? MyValue) END TstValue ULONG CODE ! Так нормально TstValue = 1 ; MESSAGE(TstValue) TstValue = BOR (TstValue, BSHIFT(1, 31)) ; MESSAGE(TstValue) TstValue = BXOR(TstValue, BSHIFT(1, 31)) ; MESSAGE(TstValue) ! А так нет, TstValue обнуляется после BXOR ChangeValue(TstValue) ChangeValue PROCEDURE(*? MyValue) CODE MyValue = 1 ; MESSAGE(MyValue) MyValue = BOR (MyValue, BSHIFT(1, 31)) ; MESSAGE(MyValue) MyValue = BXOR(MyValue, BSHIFT(1, 31)) ; MESSAGE(MyValue) Когда TstValue LONG, работает нормально.
Сразу же отвечу на несколько писем по данной теме.
Во-первых, при передаче ULONG-переменной через не типизированную ссылку СОХРАНЯЕТСЯ тип ULONG. Так что, никаких преобразований на данном этапе не происходит. Во-вторых, исходя из первого — понятно, что и в процедуре не происходит никаких явных или неявных преобразований к LONG-типу.
Но! Именно из-за того, что в процедуре не происходит преобразование типа, переменная MyValue так и остается UFO-переменной с типом ULONG. А UFO-переменные ЛЮБОГО типа перед арифметическими операциями ВСЕГДА преобразуются в тип REAL. Именно из-за этого преобразования значение x80000001 становиться x80000000!!! Ну а дальше — понятно: BXOR(x80000000,x80000000) = 0!
Так что, это — не глюк Клариона. Точнее — не совсем глюк, а документированная фича! Из-за подобной фичи, например, невозможно во View-фильтр прямо передавать ULONG-константы.