Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо