Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-11892
prophet
2003-12-21 22:29
2004.01.05
Что такое TTreeView.Workareas?


1-11995
SASH2
2003-12-17 14:33
2004.01.05
VCLZip!!!


1-11873
md
2003-12-15 14:07
2004.01.05
путь к файлу


3-11789
Апач
2003-12-09 13:25
2004.01.05
Как IBTable взять запись на редактирование


14-12089
sever-Rds
2003-12-11 03:57
2004.01.05
---|Ветка была без названия|---





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