Форум: "Начинающим";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.001 c