Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.06 c
2-1206612838
altatr
2008-03-27 13:13
2008.04.20
Как скопировать целиком строку в таблице.


2-1206519435
dumka
2008-03-26 11:17
2008.04.20
БД и INET


2-1206351835
altatr
2008-03-24 12:43
2008.04.20
Скопировать файл


2-1206701658
Ramzes001
2008-03-28 13:54
2008.04.20
Ошибка


2-1206612850
nicky000
2008-03-27 13:14
2008.04.20
ConnectDialog





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский