Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1440002554
Той
2015-08-19 19:42
2017.04.16
Как узнать все методы имеющиеся в объекте OleVariant ?


2-1439629079
RZD
2015-08-15 11:57
2017.04.16
Мерцает (подмаргивает) крупный текст на панели.


2-1440148888
lewka
2015-08-21 12:21
2017.04.16
BorderStyle для MDIForm


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский