![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BOOL -> Boolean
K-1000 © (2015-08-30 09:51:00)Вот функции конвертации:
function BoolToBoolean_1(const Value: BOOL): boolean;
begin
if (Value = False)
then Result:= False
else Result:= True;
end;
function BoolToBoolean_2(const Value: BOOL): boolean;
begin
if (not Value)
then Result:= False
else Result:= True;
end;
function BoolToBoolean_3(const Value: BOOL): boolean;
begin
Result:= Value;
end;
function BoolToBoolean_4(Value: BOOL): boolean;
begin
Result:= (Integer(Value) <> 0);
end;
Не ясно как компилятор преобразовывает (not Value).
Проверяю таким кодом:
procedure TForm1.FormCreate(Sender: TObject);
var
Value: BOOL;
begin
Value:= True; // Или False.
if BoolToBoolean(Value)
then Caption:= 'True'
else Caption:= 'False';
end;
И каждая функция работает верно.
Какая более правильная?
K-1000 (2015-08-31 13:00:00) [1]
> Dimka Maslov © (31.08.15 11:19) [8]
Во как. Спасиб.
Dimka Maslov (2015-08-31 11:19:00) [2]Нет. Если в С++ использовался тип bool, то все операции влияют только на младший байт. Он может быть нулём (false) или единицей (true). Но результат передаётся через регистр целиком и при преобразовании Integer(Value) будут учитываться все четыре байта, в которых может остаться мусор. А вот если использовался тип BOOL который на самом деле int, то сравнение с нулём корректно. Раз мы не знаем, какой именно логический тип использовался, то надо ориентироваться на худший случай и занулять все биты в которых может содержаться мусор.
K-1000 (2015-08-31 07:50:00) [3]
> Dimka Maslov © (30.08.15 18:39) [6]
>
Т.е. этот код не всегда будет работать верно?:
function BoolToBoolean_4(Value: BOOL): boolean;
begin
Result:= (Integer(Value) <> 0);
end;
Dimka Maslov (2015-08-30 18:39:00) [4]
>
> Чем лучше?
А тем, что получив переменную из кода на С++ можно напрочь избавиться от мусора в старших битах, которые при нулевом младшем не будут приводить ошибке.
Кто б сомневался (2015-08-30 16:02:00) [5]>>Не ясно как компилятор преобразовывает (not Value).
Посмотри в CPU (Ctrl + alt + C). If not bool - там сравнивается с нулем (= 0).
Так что все корректно. Я всегда использовал без каких то спец функций и туда и обратно прямым присваиванием.
А вообще откуда дым?
K-1000 (2015-08-30 15:31:00) [6]
> Dimka Maslov © (30.08.15 10:21) [3]
>
> Boolean(Integer(B) and 1)
>
Чем лучше?
Dimka Maslov (2015-08-30 10:21:00) [7]Boolean(Integer(B) and 1)
K-1000 (2015-08-30 10:00:00) [8]
> DVM © (30.08.15 09:54) [1]
Читал.
DVM (2015-08-30 09:54:00) [9]http://www.transl-gunsmoker.ru/2009/04/bool-boolean-integer.html