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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
7-12184
DeepRain
2003-10-23 23:17
2004.01.05
Резидент-перехватчик нажатий клавиш


1-11992
Nix
2003-12-18 17:04
2004.01.05
Множество форм


3-11817
Чудовище
2003-12-08 16:20
2004.01.05
Альтернатива компонентам ADO


14-12046
Думкин
2003-12-11 04:42
2004.01.05
С днем рождения! 11 декабря.


14-12069
Brahman
2003-12-10 11:09
2004.01.05
Первый блин комом ?