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

Вниз

Ord vs Integer   Найти похожие ветки 

 
Германн ©   (2008-03-06 02:21) [0]

Ещё один вопрос по теме о нашем главном программисте.
Я всегда привык, если надо перевести значение переменной типа Boolean в Integer пользоваться функцией Ord. А он использовал преобразование типов Integer(CheckBox1.Checked). Но он СИ-шник по природе.
Нет ли тут подводных камней в паскале ака Дельфи?


 
korneley ©   (2008-03-06 02:38) [1]

ИМХО все зависит от пристрастий и задачи. И понимания, что булевские, как итеджер, разные бывают. У микрософта одно, у Борланда другое. Хотя сам пользую именно integer(boolean). Сижу тихо, жду граблей (вдруг false в Дельфи = -1 станет) :)))


 
Германн ©   (2008-03-06 02:43) [2]


> korneley ©   (06.03.08 02:38) [1]
>
> ИМХО все зависит от пристрастий и задачи. И понимания, что
> булевские, как итеджер, разные бывают. У микрософта одно,
>  у Борланда другое. Хотя сам пользую именно integer(boolean).
>  Сижу тихо, жду граблей (вдруг false в Дельфи = -1 станет)
> :)))
>

Угу. Тебя понял.


 
Германн ©   (2008-03-06 02:47) [3]

Пока всё. Остальные претензии к вышеописанному чисто локальные. Завтра их ему выскажу лично.
Спасибо за участие.


 
имя   (2008-03-06 03:28) [4]

Удалено модератором


 
Германн ©   (2008-03-06 03:40) [5]

Удалено модератором


 
имя   (2008-03-06 03:41) [6]

Удалено модератором


 
Германн ©   (2008-03-06 03:47) [7]

Это у меня в зобу дыханье спёрло!
Не ну.
Для потомков, На Ник начинающийся с "пользуясь" не стоит обращать внимание.

P.S. Если модераторы определят, что сей ник принадлежит Пете, я не удивлюсь. :)


 
Германн ©   (2008-03-06 04:15) [8]

Не. Перед Петей мне нужно извиниться.


 
Германн ©   (2008-03-06 04:15) [9]

Не. Перед Петей мне нужно извиниться.


 
korneley ©   (2008-03-06 09:03) [10]


> korneley ©   (06.03.08 02:38) [1]
> ... Хотя сам пользую именно integer(boolean).

Чего-то утром тыркнуло: зря жил, пол-жизни потерял %) Это приведение типов закладывается на внутреннее представление борландовского boolean, что, по-большому, не есть гуд. Ord(), почестнее будет. Да и писАть короче :)))


 
Семеныч   (2008-03-06 09:48) [11]

> Нет ли тут подводных камней

Boolean values are denoted by the predefined constants True and False. The following relationships hold.

Boolean          ByteBool, WordBool, LongBool
False < True False <> True
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True

Это значит, что использовать Boolean в качестве целого надо аккуратно и с умом, независимо от способа приведения. Например:

var
 B: boolean;
 LB: LongBool;
begin
 B := True;
 LB := True;
 if B = LB ... // Результат гарантирован.
 if Integer(B) = Integet(LB) ... // Результат не гарантирован.


 
Семеныч   (2008-03-06 09:51) [12]

Блин, таблица съехала... ну не держится табуляция...

Boolean                ByteBool, WordBool, LongBool
False < True                    False <> True
Ord(False) = 0                 Ord(False) = 0
Ord(True) = 1                  Ord(True) <> 0
Succ(False) = True           Succ(False) = True
Pred(True) = False            Pred(False) = True


 
Loginov Dmitry ©   (2008-03-06 14:00) [13]


> Я всегда привык, если надо перевести значение переменной
> типа Boolean в Integer пользоваться функцией Ord. А он использовал
> преобразование типов Integer(CheckBox1.Checked). Но он СИ-
> шник по природе.
> Нет ли тут подводных камней в паскале ака Дельфи?


Ни разу не использовал для такого приведения Ord. Обычно - Byte(). Но "подводных камней" быть не должно, если конечто Boolean так в дальнейшем и будет принимать значения "0" и "1" :)

Хорошь по мелочам к человеку придираться! Наверняка можно найди гораздо более весомые аргументы! :)


 
han_malign ©   (2008-03-06 14:09) [14]


> Но "подводных камней" быть не должно

оцените сами
program _bcast;
{$APPTYPE CONSOLE}
{$IFDEF VER150}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CAST OFF}
{$WARN UNSAFE_CODE OFF}
{$ENDIF}
uses
 Windows,
 SysUtils;
function bcast(b: ByteBool; oa: array of const): string;
begin
  Result:= Format(
     #9"Ord(Bool): %d; Int(Bool): %d; Absolute cast(Bool): %x"#13#10+
     #9"Ord(ByteBool): %d; Int(ByteBool): %d; Absolute cast(ByteBool): %x"#13#10+
     #9"Open array cast!: %x",
     [Ord(oa[0].VBoolean), Integer(oa[0].VBoolean), PByte(@oa[0].VBoolean)^,
      Ord(b), Integer(b), PByte(@b)^,
      oa[0].VInteger]);
end;

begin
  writeln("false: "+bcast(false, [false]));
  writeln("true: "+bcast(true, [true]));
  //fill the stack and check open array cast
  writeln("fake: "+bcast(true, [65530]));
  writeln("false: "+bcast(false, [false])+"<>0!!!");
end.

----------------------------------------------
false: Ord(Bool): 0; Int(Bool): 0; Absolute cast(Bool): 0
       Ord(ByteBool): 0; Int(ByteBool): 0; Absolute cast(ByteBool): 0
       Open array cast!: 0
true:  Ord(Bool): 1; Int(Bool): 1; Absolute cast(Bool): 1
       Ord(ByteBool): -1; Int(ByteBool): -1; Absolute cast(ByteBool): FF
       Open array cast!: 1
fake:  Ord(Bool): 250; Int(Bool): 250; Absolute cast(Bool): FA
       Ord(ByteBool): -1; Int(ByteBool): -1; Absolute cast(ByteBool): FF
       Open array cast!: FFFA
false: Ord(Bool): 0; Int(Bool): 0; Absolute cast(Bool): 0
       Ord(ByteBool): 0; Int(ByteBool): 0; Absolute cast(ByteBool): 0
       Open array cast!: FF00<>0!!!

ЗАМЕТЬТЕ: oa[0].VBoolean - типа boolean!!!


 
han_malign ©   (2008-03-06 14:40) [15]


> если конечто Boolean так в дальнейшем и будет принимать значения "0" и "1"


в контексте темы Ord() и Integer() - абсолютно равнозначен...
значение константы True документированно и значит неизменно, а вот приведенное значение переменной типа boolean может быть любым...

З.Ы. на ByteBool и открытом массиве констант лично грабли словил...


 
Anatoly Podgoretsky ©   (2008-03-06 15:03) [16]

> Германн  (06.03.2008 02:21:00)  [0]

Узнаешь когда получишь.



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

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

Наверх




Память: 0.51 MB
Время: 0.02 c
11-1188137808
Jimmy Lee
2007-08-26 18:16
2008.04.20
почему размер DemoEmpty у меня больше, чем в примере?


15-1204741755
Steep
2008-03-05 21:29
2008.04.20
Линукс и сотел...


2-1206287987
AndrewG
2008-03-23 18:59
2008.04.20
S M A RT A P I


2-1206279898
Stepper
2008-03-23 16:44
2008.04.20
Как прикрутить ProgressBar к IdHTTP?


15-1204721767
Petr V. Abramov
2008-03-05 15:56
2008.04.20
Позаботились об отечественном IT