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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
tech
незнакомец
Сообщения: 8
Зарегистрирован: 10.10.2010 13:05:20
Контактная информация:

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

Сообщение 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'?
Последний раз редактировалось tech 08.05.2011 21:53:11, всего редактировалось 1 раз.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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

Сообщение devels »

Честно говоря меня эта фича-бага тоже всегда удивляла, только вот непонятно, откуда у нее ноги растут.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Всё очень просто:
  • False = 0;
  • True = любое отличное от 0.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Ноги растут из того, что not 0 = -1 ($FFFF... в зависимости от размерности)
tech
незнакомец
Сообщения: 8
Зарегистрирован: 10.10.2010 13:05:20
Контактная информация:

Сообщение 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');
...
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Или даже так:

Код: Выделить всё

...
Label1.Caption := BoolToStr(a,'Стопудово!','Фуфло!');
...
Ответить