Страница 1 из 1

Почему BoolToStr(true) = '-1'?[Решено]

СообщениеДобавлено: 08.05.2011 11:30:21
tech
Делали с учащимися микропроект в Lazarus по учебнику (Delphi).
Помимо прочего, задание включает следующий алгоритм:
1. Считываем из двух текстовых полей нули или единицы.
2. Выполяем логическую операцию (and или or).
3. Результат отображаем в метке.

Для преобразования string в boolean и обратно используем функции StrToBool и BoolToStr соответственно.

Удивляюсь, когда оказывается, что BoolToStr возвращает '-1', а не '1', если переданная ей лог.переменная имеет значение true.
Приходится "обходить" '-1' примерно так:
Код: Выделить всё
...
var and1:boolean;
...
and1 := StrToBool(Edit1.Text) and StrToBool(Edit2.Text);
if and1 := true then Label1.Caption := '1'
else Label1.Caption := '0';
...

Может быть не надо так делать и есть другая функция, которая возвращает '1'?
Почему StrToBool превращает '1' в true, а BoolToStr превращает true в '-1'?

Re: Почему BoolToStr(true) = '-1'?

СообщениеДобавлено: 08.05.2011 14:29:12
svk12
Вот описание функции:
http://www.freepascal.org/docs-html/rtl ... tostr.html
Чтобы получить 'True' или 'False', надо вызвать функцию со вторым параметром =True.
Также можно подсунуть ей свои строки для 'True' и 'False'...

Re: Почему BoolToStr(true) = '-1'?

СообщениеДобавлено: 08.05.2011 19:39:45
devels
Честно говоря меня эта фича-бага тоже всегда удивляла, только вот непонятно, откуда у нее ноги растут.

Re: Почему BoolToStr(true) = '-1'?

СообщениеДобавлено: 08.05.2011 19:50:50
Mr.Smart
Всё очень просто:
  • False = 0;
  • True = любое отличное от 0.

Re: Почему BoolToStr(true) = '-1'?

СообщениеДобавлено: 08.05.2011 21:06:53
Иван Шихалев
Ноги растут из того, что not 0 = -1 ($FFFF... в зависимости от размерности)

Re: Почему BoolToStr(true) = '-1'?

СообщениеДобавлено: 08.05.2011 21:52:12
tech
svk12 писал(а):Вот описание функции:
http://www.freepascal.org/docs-html/rtl ... tostr.html
Чтобы получить 'True' или 'False', надо вызвать функцию со вторым параметром =True.
Также можно подсунуть ей свои строки для 'True' и 'False'...


Т.е. код может выглядеть так, если требуется вывести строки 'True' или 'False':
Код: Выделить всё
...
var a:boolean;
...
a := StrToBool(Edit1.Text) and StrToBool(Edit2.Text);
Label1.Caption := BoolToStr(a,true);
...

Или так, если выводим '1' или '0':
Код: Выделить всё
...
Label1.Caption := BoolToStr(a,'1','0');
...

Re: Почему BoolToStr(true) = '-1'?[Решено]

СообщениеДобавлено: 09.05.2011 01:31:07
svk12
Или даже так:
Код: Выделить всё
...
Label1.Caption := BoolToStr(a,'Стопудово!','Фуфло!');
...