Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.04.16;
Скачать: CL | DM;

Вниз

BOOL -> Boolean   Найти похожие ветки 

 
K-1000 ©   (2015-08-30 09:51) [0]

Вот функции конвертации:


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;


И каждая функция работает верно.

Какая более правильная?


 
DVM ©   (2015-08-30 09:54) [1]

http://www.transl-gunsmoker.ru/2009/04/bool-boolean-integer.html


 
K-1000 ©   (2015-08-30 10:00) [2]


> DVM ©   (30.08.15 09:54) [1]


Читал.


 
Dimka Maslov ©   (2015-08-30 10:21) [3]

Boolean(Integer(B) and 1)


 
K-1000 ©   (2015-08-30 15:31) [4]


> Dimka Maslov ©   (30.08.15 10:21) [3]
>
> Boolean(Integer(B) and 1)
>  


Чем лучше?


 
Кто б сомневался ©   (2015-08-30 16:02) [5]

>>Не ясно как компилятор преобразовывает (not Value).

Посмотри в CPU (Ctrl + alt + C). If not bool - там сравнивается с нулем (= 0).
Так что все корректно.  Я всегда использовал без каких то спец функций и туда и обратно прямым присваиванием.
А вообще откуда дым?


 
Dimka Maslov ©   (2015-08-30 18:39) [6]


>
> Чем лучше?


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


 
K-1000 ©   (2015-08-31 07:50) [7]


> Dimka Maslov ©   (30.08.15 18:39) [6]
>


Т.е. этот код не всегда будет работать верно?:


function BoolToBoolean_4(Value: BOOL): boolean;
begin
Result:= (Integer(Value) <> 0);
end;


 
Dimka Maslov ©   (2015-08-31 11:19) [8]

Нет. Если в С++ использовался тип bool, то все операции влияют только на младший байт. Он может быть нулём (false) или единицей (true). Но результат передаётся через регистр целиком и при преобразовании Integer(Value) будут учитываться все четыре байта, в которых может остаться мусор. А вот если использовался тип BOOL который на самом деле int, то сравнение с нулём корректно. Раз мы не знаем, какой именно логический тип использовался, то надо ориентироваться на худший случай и занулять все биты в которых может содержаться мусор.


 
K-1000 ©   (2015-08-31 13:00) [9]


> Dimka Maslov ©   (31.08.15 11:19) [8]


Во как. Спасиб.



Страницы: 1 вся ветка

Текущий архив: 2017.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1440325683
castor
2015-08-23 13:28
2017.04.16
элементы документации


15-1460411018
KilkennyCat
2016-04-12 00:43
2017.04.16
12 апреля 1961 года, Ю. А. Гагарин, «Восток-1», «Байконур»


2-1440917515
K-1000
2015-08-30 09:51
2017.04.16
BOOL -> Boolean


2-1441016318
lerandivan
2015-08-31 13:18
2017.04.16
Загрузка данных из текстового файла в StringGrid


15-1460099290
DayGaykin
2016-04-08 10:08
2017.04.16
Обнаружение утечек в функции.