Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
Внизboolean vs bool Найти похожие ветки
← →
olookin (2003-12-20 10:34) [0]Есть ли разница в использовании boolean и bool для преобразования типов? Я всегда думал что нет... Теперь думаю иначе. Почему? А потому, что при использовании boolean у меня случается страшный глюк, а при использовании bool - нет...
(речь идет о назначении булевой переменной таким образом:
b:=boolean(Length(mas))
или
b:=bool(Length(mas))
)
Что скажут мастера по поводу этого?
(если кому интересно, то глюк такой - при использовании boolean поочередно исчезают некоторые пункты в главном меню главной формы, причем исчезают как только длина массива mas нечетная и больше 3, и появляются обратно каждый раз при четной длине массива. Длина массива mas увеличивается на один каждый раз при вызове b:=boolean(Length(mas)))
← →
Digitman (2003-12-20 11:23) [1]SizeOf(Boolean) = 1 (Boolean = ByteBool !!)
SizeOf(Bool) = 4 (Bool = LongBool !!)
← →
TUser (2003-12-20 11:23) [2]Кажется такие штуки не должны происходить из-за преобразования типов. А если есть подоздрения, то лучше наверное писать так
if length(mas)>0 {или любое другое условия}
then b:=true else b:=false;
← →
jack128 (2003-12-20 11:28) [3]ошибки, как верно заметил Digitman, возникают из - за разных размеров типов
например
var b : boolean;
bo : bool;
begin
bo := BOOL(256); // bo := Integer(256) <> 0; bo = true
if bo then ShowMessage("BOOL");
b := BOOLEAN(256); // b := byte(256) <> 0; bo = false
if b then ShowMessage("BOOLEAN");
end;
← →
olookin (2003-12-20 11:52) [4]to jack128
Ваш пример очень верен и показателен... Впрочем я немного изменю его. А именно, вместо 256 поставлю 25. (ну потому скажем, что длина массива mas все-таки меньше 256). Оба сообщения понятно появляются... Значит, в этом случае виновато не преобразование типов?
← →
olookin (2003-12-20 11:53) [5]to TUser
Верно, так я раньше и писал... Использование преобразования типов обусловлено исключительно желанием сделать код более компактным...
← →
Digitman (2003-12-20 11:55) [6]
> в этом случае виновато не преобразование типов
"виновато", очевидно, твое непонимание того, что при этих "преобразованиях" происходит) ... ты вот даже тип переменной b не привел ... а ведь это крайне важно во всей этой сомнительной по необходимости свистопляске с преобразованиями)
← →
jack128 (2003-12-20 11:57) [7]приведи код. Какие конкретно условия не выполняются (хотя должны выполнятся) или выполняются (хотя не должны)?
← →
olookin (2003-12-20 12:32) [8]to Digitman
Может я и не прав, что не привел описания булевой переменной, но под булевой переменной я имел переменную типа boolean...
to jack128
Тут я должен заметить следующее... В пустом проекте аналогичная процедура не вызывает глюка (т.е. с меню ничего не происходит). И поэтому я не исключаю большого глюка, но уже с моей стороны как программиста. Однако удивляет не то, где я мог допустить ошибку (да вероятно не один десяток ошибок), а то, что использование boolean и bool дает совершенно разный результат. Хотя теоретически должно быть одно и то же...
Вот процедура, в которой собственно и происходит то, чего не должно происходить (и соответственно не происходит того, что должно)...
procedure TEDIPbase.MenuState;
var i: integer;
b: boolean;
begin
b:=bool(Length(EqapFileWnd));
//а раньше было так - b:=boolean(Length(EqapFileWnd));
with ToolBar1 do
for i:=0 to ButtonCount-1 do
with Buttons[i] do
if (ImageIndex=Close1.ImageIndex) or
(ImageIndex=Closeall1.ImageIndex) or
(ImageIndex=Save2.ImageIndex) or
(ImageIndex=Showcascade1.ImageIndex) or
(ImageIndex=Hideall1.ImageIndex) or
(ImageIndex=Savecartridge1.ImageIndex) then
Enabled:=b;
Close1.Enabled:=b;
Closeall1.Enabled:=b;
Save2.Enabled:=b;
Savecartridge1.Enabled:=b;
Showcascade1.Enabled:=b;
Hideall1.Enabled:=b;
end;
Эта процедура вызывается ну скажем 15 раз. Начиная с третьего раза (при использовании boolean) начинают поочередно исчезать/появляться пункты главного меню. Ну например пункт Close1. Однако вот пункт например Save2 остается видимым всегда...
← →
Digitman (2003-12-20 13:06) [9]рассмотрим ситуацию
var b: Boolean;
b:=boolean(Length(EqapFileWnd));
пусть ф-ция Length(EqapFileWnd) возвращает зн-е = 256 (т.е. <> 0)
число 256 - это, по декларации ф-ции Length(), Integer-значение
Integer в Win32 занимает 4 байта, в которые число 256 будет записано так :
мл.байт мл.слова = 0
ст.байт мл.слова = 1
мл.байт ст.слова = 0
ст.байт ст.слова = 0
далее ты требуешь рассматривать Integer-значение как Boolean (однобайтное значение)
при этом оно станет равно мл.байту мл.слова, т.е. = 0
этот ноль "один в один" (безо всяких преобразований и предположений с т.з. компилятора) будет записан в переменную b, ибо ее размер так же равен 1-му байту
в результате b станет равным False
а для того чтобы b стал равным True, требовалось, чтобы мл.байт мл.слова приводимого Integer-значения, был не равен нулю
вот и вся "кухня" этого "глюка")
← →
olookin (2003-12-20 13:13) [10]to Digitman
Я понял. Глюк однако проявляется в ИСЧЕЗНОВЕНИИ пунктов меню, а не в их ДИЗАБЛЕ. Это тоже проявление кухни?
← →
Verg (2003-12-20 13:20) [11]
> b:=bool(Length(mas))
Что за бред...
Скажи для себя вслух то, что ты хотел выразить этим варажением, и, скорее всего у тебя получится:
b := length( mas ) <> 0;
← →
olookin (2003-12-20 13:21) [12]to Verg
Кто мешает записать так? Результат то один и тот же...
← →
Digitman (2003-12-20 13:22) [13]
> Это тоже проявление кухни?
нет.
это уже какая-то иная твоя ошибка, явно не связанная с приведенным тобой кодом.
p.s.
думаю, что изначально следовало бы использовать объекты-акции (TBasicAction) для централизации и прозрачности логики, связанной с видимостью/активностью таких контролов как меню, кнопки и пр.
← →
Verg (2003-12-20 13:24) [14]
> olookin © (20.12.03 13:21) [12]
> to Verg
>
> Кто мешает записать так? Результат то один и тот же...
Зачем выражать естесственные мысли противоестесственным языком?
А точнее приучать себя к "извратам"?
Это и есть путь ко всевозможным "глюкам".
← →
Digitman (2003-12-20 13:26) [15]
> olookin © (20.12.03 13:21) [12]
> to Verg
>
> Кто мешает записать так? Результат то один и тот же...
да нет, как видишь)
далеко не всегда один и тот же !
в случае
AnyBooleanVariable := AnyIntegerStatement <> 0;
ты получишь ГАРАНТИРОВАННО правильный и ожидаемый результат ВНЕ зависимости от типов AnyIntegerStatement и AnyBooleanVariable
← →
Verg (2003-12-20 13:30) [16]Еще, кто тебе гарантировал, что строка:
> b:=bool(Length(mas))
означает именно то, что ты хочешь получить в b true, если length( mas )<>0 ?
Обоснуй.
type
Boolean = (false, true);
А почему бы и не наоборот?
type
Boolean = (true, false);
← →
olookin (2003-12-20 13:43) [17]to Verg
Еще, кто тебе гарантировал, что строка:
> b:=bool(Length(mas))
означает именно то, что ты хочешь получить в b true, если length( mas )<>0 ?
Может и смешно звучит, но получил эмпирически... А на самом деле просто знаю, что bool(N) возвращает 0 если N=0 и 1 во всех остальных случаях...
to Digitman
Насчет ActionManager - это верно.
Насчет ошибки в другом месте - это скорее всего так. Но повторюсь - глюк имеет место если вместо BOOL я использую BOOLEAN. Значит есть связь между применением boolean и исчезновением пунктов меню...
Полагаю, что вопрос нерешаем в рамках обсуждения bool и boolean... Поэтому предлагаю закрыть эту тему. Спасибо всем.
← →
Verg (2003-12-20 13:54) [18]
> Может и смешно звучит, но получил эмпирически... А на самом
> деле просто знаю, что bool(N) возвращает 0 если N=0 и 1
> во всех остальных случаях...
Не доведет тебя эта эмпирика до добра...
"bool(N) возвращает 0" - это как вот тебя понимать?
Ты недавно из "C"?
Понимаешь, bool - это либо false, либо trueи никаких нулей и единиц!
← →
Digitman (2003-12-20 14:12) [19]
> на самом деле просто знаю, что bool(N) возвращает 0 если
> N=0 и 1 во всех остальных случаях
да ничего эта конструкция не "возвращает" !
это - лишь явное информирование компилятора о том, что ты ОСОЗНАННО пытаешься интерпретировать тип N как SomeBoolType
и если SizeOf(N) окажется равным SizeOf(SomeBoolType), компилятор вообще ничего не делает (т.е. не вставляет никакого неявного кода преобразования)
а далее все зависит от того, как ты будешь пытаться использовать значение типа SomeBoolType - компилятор оставляет это на твоей совести, ибо от него потребовали не выдавать никаких предупреждений на этот счет (а ошибки компиляции тем более не будет - приводимые типы-то совместимы по размеру и принадлежности к одному и тому же баз.типу !!)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.012 c