Форум: "Прочее";
Текущий архив: 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